5

SQL 標準では、UNIQUE 制約の一部である列に複数の NULL 値が許可されていることを理解しています。

私が理解していないのは、UNION コンストラクト (少なくとも PostgreSQL では) が NULL 値を同じものとして扱う理由です。例えば:

$ select * from tmp_a;
 a | b
---+---
 a | b
 a |
   |
(3 rows)

$ select * from tmp_b;
 a | b
---+---
 a | c
 a |
   |
(3 rows)

$ select a, b from tmp_a union select a, b from tmp_b order by 1, 2;
 a | b
---+---
 a | b
 a | c
 a |
   |
(4 rows)
4

4 に答える 4

3

これ以上の主要な情報源は見つかりませんでしたが、このウィキペディアの記事によると、グループ化操作に関しては NULL の特殊なケースがあります。DISTINCT や UNION などのこれらの操作では、2 つの NULL が「等しくない」場合でも、NULL は NULL と「区別されません」。

于 2011-04-20T03:20:20.580 に答える
2

SQL-92 標準の一般規則は次のとおりです。

13.1 'declare cursor' (カーソルのORDER BY一部であることを思い出してください) 一般規則 3b:

null 値の次の特別な処理。null のソート キー値が非 null 値よりも大きいか小さいかは実装定義ですが、null であるすべてのソート キー値は、すべての非 null 値よりも大きいと見なされるか、すべての非 null 値よりも小さいと見なされます。 -ヌル値。

SQL-89 は、IMO と同じことをもう少し明確に述べています。

との両方が値でx = yあるかどうかは不明です が、と のコンテキストでは、値は別の値と同一であるか、重複しています。xyNULLGROUP BYORDER BYDISTINCTNULLNULL

PostgreSQL は必要に応じて重複を削除するために並べ替えを実行しており、標準に従って値をUNIONグループ化していると思います。NULL

于 2011-04-20T07:59:20.073 に答える
1

SQLite サイトに、これに関する興味深いWeb ページがあり、SQL 実装間の違いを調査しています。

于 2011-04-20T03:32:11.880 に答える
1

SQL でのヌルの扱いは根本的に一貫性がなく、矛盾する場合もあります。SQL での null の動作の背後には、論理的に健全な根拠はありません。さまざまな場所で適用されるさまざまなルールを学び、それらを適用するか回避する必要があります。

于 2011-04-27T14:17:23.393 に答える