これに少しひねりを加えるには、これを試してみてください。
select (case when null = null then 1 else 0 end) from dual
これも戻り0
ます。ヌルはそれ自体と同じではありません。
しかし、これは何を返しますか?
select (case when null <> null then 1 else 0 end) from dual
これがまた戻ってきます0
!ああ聖なる...それはそれ自体と等しくない間、それはそれ自体と等しくさえありません...それは狂気にならずに把握するためのかなりの状況...
なぜこれをすべて覚えているのですか?-尋ねるかもしれません
1つの例は索引付けNULL
です。Oracleでは、列がその値の使用を許可している場合、索引は値に対して機能すると予想されるようには機能しません。これは、インデックスが与えられた場合、インデックスに含まれる行のすべての値(フィールド、フィールド上の関数など)がすべて NULL
である場合、その行はその指定されたインデックスでインデックス付けされないことを意味します。つまり、これは、インデックスが付けられた値が1つだけのインデックス(たとえば、フィールドが直接)の場合、null値は、その行がインデックスに含まれないことを意味します。
これを克服するには
- 正の整数のみを含む列のように、意味を意味的に表す明確で正確な値
NULL
を持つインデックスを追加して、それらをすばやくクエリできるようにすることをお勧めします。NVL(mynullcol,-1)
- または、定数値を追加して「半複数値」インデックスを作成することもできます。このインデックスは、すべての行にインデックスを付けます。一方は定数であるため、一方はnullになります。(
create index idx_myindex on table(column_with_nulls,1);
)
(この質問とこの記事では、この主題についてもう少し詳しく説明します)
別の例は注文です...
select (case when null < null then 1 else 0 end) from dual;
select (case when null > null then 1 else 0 end) from dual;
両方0
。これは大丈夫です...私たちは今までにこれを期待していました...そしてこれはどうですか?
select (case when 'Abc' > null then 1 else 0 end) from dual;
select (case when null > 'Abc' then 1 else 0 end) from dual;
うーん...また両方0
。これは問題になる可能性があります-注文はどのように機能しますか?
select col_1 from
(select null as col_1 from dual)
union all (select 'Abc' as col_1 from dual)
union all (select null as col_1 from dual)
union all (select null as col_1 from dual)
order by col_1
ただし、これは一貫して次のようになります。
Abc
null
null
null
... order by col_1 DESC
返品の使用:
null
null
null
Abc
したがって、これから、経験的に、それはそう思われ'Abc' < null
ます...しかし、@ ypercubeの貴重なコメントによると:
NULLS LAST
ソート順は、およびNULLS FIRST
修飾子を使用して設定できます(少なくともOracleでは)。観察されるのは、ORDERBYに修飾子がない場合のデフォルトのソート順です。
NULL
ねじれたビジネスであるため、可能であればそれを回避するのが賢明です...(これは、SQLだけでなく、OOP言語の特定の状況にも当てはまります。)