私は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;
nullは空の文字列とまったく同じですが、文字列データ型のみです。数値または日付はnullでもかまいません。この場合、nullは空の文字列ではありません(同じデータ型でもありません)。文字列が空の文字列と同じであるとのOracleの解釈に非常に不満を持っている人がたくさんいます。これは、リレーショナル理論とSQL標準のすべての原則に違反しています。 Oracleは今後、データ型VARCHARを使用してSQL標準に従う可能性があると言っていますが、私は息を止めません。確認済み! – mathguy
合意しておいて、OracleのNULLのサポートは貧弱ですが、非常に古い歴史に根ざしており、現在は変わることはありません。あなたはちょうどそれに慣れる。通常、NULL可能な列はオプションのフィールドに使用され、不完全な(未知の、または未定義の)データを持つ行を格納できるようにします。 –
OracleのVarChar2およびnVarChar2フィールドの新しいデザインは、NOT NULLとしてデフォルトの '' –