36
26

More than 5 years have passed since last update.

SQLのIN句に複数カラムを指定する方法とNULLのものも含めて検索する方法

Last updated at Posted at 2018-09-27

SQLの検索で、

SELECT * FROM table
WHERE (column1 = value1 AND column2 = value2) OR (column1 = value3 AND column2 = value4);

というようなものを書きたいときに

SELECT * FROM table
WHERE (column1, column2) IN (
  (value1, value2),
  (value3, value4)
);

と書くことができます。

個人的にMySQL独自の記述だと思っていたけども、SQL99の標準として対応しているということを知りました。
確かにPostgreSQL 9.5Oracle 11.2でも使えることを確認しました。

この構文に名前があるのかを調べたところ、
INとEXISTSの違い
にて「行値構成子」、「行値式」というのだと書かれていました。

ただ、残念なのが、NULLを検索する事ができないです。
例えば下記のようなデータを持つtest_tableがある場合に、

id name content
1 hoge hogehoge
2 piyo piyopiyo
3 fuga NULL
SELECT * FROM test_table
WHERE (name, content) IN (
  ('hoge', 'hogehoge'),
  ('fuga', NULL)
);

というSQLを実行すると結果はid=1のものしか返ってきません。
content=nullの検索でunknownになるからだと思います。

やや強引ですが、NULLの場合に、そのカラムに絶対に入らない値を指定することで検索できます。

SELECT * FROM test_table
WHERE (name, COALESCE(content, 'NULLの場合')) IN (
  ('hoge', 'hogehoge'),
  ('fuga', 'NULLの場合')
);
36
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
26