NVL
別の方法として、値が null の場合に返される関数と指定されたリテラルを使用できます。
-- both are not nulls
SQL> with t1(col1, col2) as(
2 select 123, 123 from dual
3 )
4 select 1 res
5 from t1
6 where nvl(col1, -1) = nvl(col2, -1)
7 ;
RES
----------
1
-- one of the values is null
SQL> with t1(col1, col2) as(
2 select null, 123 from dual
3 )
4 select 1 res
5 from t1
6 where nvl(col1, -1) = nvl(col2, -1)
7 ;
no rows selected
-- both values are nulls
SQL> with t1(col1, col2) as(
2 select null, null from dual
3 )
4 select 1 res
5 from t1
6 where nvl(col1, -1) = nvl(col2, -1)
7 ;
RES
----------
1
もちろん、@Codo がコメントで指摘したように、上記のアプローチでは、列を比較するリテラルを選択する必要があります。比較する列が数値データ型 (たとえば) であり、任意の値を受け入れることができる場合、もちろん -1 を選択することはできません。その制限をなくすために、decode
関数 (数値または文字データ型の場合) を使用できます。
with t1(col1, col2) as(
2 select null, null from dual
3 )
4 select 1 res
5 from t1
6 where decode(col1, col2, 'same', 'different') = 'same'
7 ;
RES
----------
1