概要
SQLのIN句に複数カラムを指定する方法とNULLのものも含めて検索することがありました。
具体的には以下のような形
sql
SELECT * FROM table
WHERE (column1, column2) IN (hoge,huga);
上記の形はうまく実行できますが、以下のようにnullが含まれるとうまく動作しません。
sql
SELECT * FROM table
WHERE (column1, column2,column3) IN ('hoge','huga',NULL);
実際に私の場合は値が変数でnullが入ってくる可能性もありました。
value3がnullの場合に何もデータが取得できないという状態でした。
sql
SELECT * FROM table
WHERE (column1, column2, column3) IN (value1,value2,value3);
対応方法
この時ORACLEのNVLという関数を使って対応しました。
NVL関数はNULL(空白として戻される)を文字列に置換して問合せの結果に含めることができます。
NVL(value3, 'NULL');
NVL関数を使うと、value3がnullだった時、文字列のNULLが設定されます。
sql
SELECT * FROM table
WHERE (NVL(column1, 'NULL'),NVL(column2, 'NULL'), NVL(column3, 'NULL')) IN (NVL(value1, 'NULL'),NVL(value2, 'NULL'),NVL(value3, 'NULL'));
これで想定している値が取得できました。