2016-05-11 3 views
0

私はOracleがNULL値を処理する方法を理解しようとしています。これは本当に私がすでに発見したことを確認して、明らかに何かを見過ごさないようにするための要求です。以下は、Oracleが空の文字列を処理するのと同じようにNULL値を処理することを確認するためのスクリプトです。このような場合は、問合せ時に索引に難読化を導入する以外に、フィールドがNULLになるようにOracleデータベースを開発する理由を教えてください(つまり、WHERE NVL(FieldName、 'Default Value ')!='テスト ')???OracleのNULL値の利点は何ですか?

-- Returns only 2 rows 
-- Oracle doesn't differentiate from blank strings and NULL values 
SELECT NULL AS Test_Nulls from dual 
UNION 
SELECT '' AS Test_Nulls from dual 
UNION 
SELECT 'Test' AS Test_Nulls from dual; 

-- Returns "X" 
-- Further proof Oracle doesn't differentiate from blank strings and NULL values 
SELECT 'X' AS Test_Nulls 
FROM dual 
WHERE '' is NULL; 

-- Returns "X" 
-- Even further proof Oracle doesn't differentiate from blank strings and NULL values 
SELECT NVL('','X') AS Test_Nulls 
FROM dual; 

-- Returns 3 rows 
-- Oracle recognizes <Carriage Return> + <Line Feed> 
SELECT '' AS Returned from dual 
UNION 
SELECT ' 
' AS Returned FROM dual 
UNION 
SELECT 'Test' AS Returned FROM dual; 
+5

nullは空の文字列とまったく同じですが、文字列データ型のみです。数値または日付はnullでもかまいません。この場合、nullは空の文字列ではありません(同じデータ型でもありません)。文字列が空の文字列と同じであるとのOracleの解釈に非常に不満を持っている人がたくさんいます。これは、リレーショナル理論とSQL標準のすべての原則に違反しています。 Oracleは今後、データ型VARCHARを使用してSQL標準に従う可能性があると言っていますが、私は息を止めません。確認済み! – mathguy

+1

合意しておいて、OracleのNULLのサポートは貧弱ですが、非常に古い歴史に根ざしており、現在は変わることはありません。あなたはちょうどそれに慣れる。通常、NULL可能な列はオプションのフィールドに使用され、不完全な(未知の、または未定義の)データを持つ行を格納できるようにします。 –

+0

OracleのVarChar2およびnVarChar2フィールドの新しいデザインは、NOT NULLとしてデフォルトの '' –

答えて

0

単純な答えは:私は、Oracleで行う任意の新しいデータベース設計作業のために、私はすべてのVARCHAR2およびNVARCHAR2およびCHAR2とnchar2フィールドがNULL許可しないように設定され、空の文字列のデフォルト値を持っています。私は、「2」という接尾辞を追加する命名規則と、他のデータベースプラットフォームにとって共通のフィールド型ではないという事実を常に疑っています。私にとっては、Oracleが、「ああ、まあ、...正しいとは言えないので、新しい名前をつけよう」のような、彼らの初期の状況を、Oracleが最後に処理したことを意味します。これは私の2セントです。

関連する問題