7

ANSI-92 SQL では、との比較がNULL「偽」と評価されることが義務付けられています。たとえば、次のようになります。

SELECT * FROM table WHERE field = NULL
SELECT * FROM table WHERE field != NULL

そのように比較できないため、どちらも行を返しません。NULL代わりに、述語IS NULLandIS NOT NULLを代わりに使用する必要があります。

SELECT * FROM table WHERE field IS NULL
SELECT * FROM table WHERE field IS NOT NULL

調査によると、Oracle 1、PostgreSQL、MySQL、および SQLite はすべて ANSI 構文をサポートしています。そのリストに DB2 と Firebird を追加します。

ANSI_NULLSオフになっているSQL Server 以外に、ANSI 以外の構文をサポートしている RDBMS は何ですか?

1空の文字列全体 =NULL混乱にもかかわらず。

4

2 に答える 2

15

価値があるのは、何かを NULL と比較することは厳密には false ではなく、unknownです。さらに、NOT不明はまだ不明です。

ANSI SQL-99 は述語を定義しますIS [NOT] DISTINCT FROM。これにより、comarison で null と null 以外の値を混在させ、常に true または false を取得できます。このように null と比較された null は true です。それ以外の場合、null と比較された null 以外は false です。したがって、否定はおそらく期待どおりに機能します。

PostgreSQL、IBM DB2、および Firebird はサポートしていIS [NOT] DISTINCT FROMます。

<=>MySQL には、オペランドが同じ場合は true を返し、異なる場合は false を返す同様の null セーフ比較演算子があります。

オラクルには最も困難な道があります。NVL()またはブール式を使用して創造的になる必要があります。

WHERE a = b OR (a IS NULL AND b IS NULL)

うん。

于 2011-09-09T21:09:05.477 に答える
3

以下は、SQLite、PostgreSQL、Oracle、Informix、DB2、MS-SQL、OCELOT、MySQL 3.23.41、MySQL 4.0.16、Firebird、SQL Anywhere、および Borland Interbase での null 処理の優れた比較です。

于 2011-09-09T21:10:21.173 に答える