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.5
とOracle 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の場合')
);