SQL 中最強大的也是最復雜的就是查詢部分。在需要查詢多條記錄時我們一般會采用 in 關鍵字來指定要查詢的條件:
SELECT * FROM t_user WHERE uid IN (1,2,3,4,5,6,7,8,9);
但如果對應的數據需要兩個或更多字段才能確定,可能會寫出以下的 SQL 語句:
SELECT * FROM t_user WHERE
(first_name = 'first_name_1' AND last_name = 'last_name_1') OR
(first_name = 'first_name_2' AND last_name = 'last_name_2') OR
(first_name = 'first_name_3' AND last_name = 'last_name_3') OR
(first_name = 'first_name_4' AND last_name = 'last_name_4') OR
(first_name = 'first_name_5' AND last_name = 'last_name_5') OR
(first_name = 'first_name_6' AND last_name = 'last_name_6') OR
(first_name = 'first_name_7' AND last_name = 'last_name_7');
以上代碼當然能用,但拼接出來的語句過于復雜。有一個方法可以改善這個問題,就是使用多列 IN 的語法。
MySQL 中的多列 IN 查詢
MySQL 是支持多列 IN 查詢的。以上的 SQL 可以改寫為:
SELECT * FROM t_user WHERE (first_name,last_name) IN (('first_name_1','last_name_1'),('first_name_2','last_name_2'),('first_name_3','last_name_3'),('first_name_4','last_name_4'),('first_name_5','last_name_5'),('first_name_6','last_name_6'),('first_name_7','last_name_7')
);
SQLite 中的多列 IN 查詢
SQLite 也支持多列 IN 查詢,只是語法上和 MySQL 有所不同,需要多加一個 VALUES 關鍵字:
SELECT * FROM t_user WHERE (first_name,last_name) IN ( VALUES('first_name_1','last_name_1'),('first_name_2','last_name_2'),('first_name_3','last_name_3'),('first_name_4','last_name_4'),('first_name_5','last_name_5'),('first_name_6','last_name_6'),('first_name_7','last_name_7')
);
PostgreSQL 中的多列 IN 查詢
PostgreSQL 也支持隊列 IN 查詢,在官方文檔中,這種形式被稱為“行構造器”,參見:PostgreSQL 子查詢表達式?。其多列查詢的語法和 MySQL 相同:
SELECT * FROM t_user WHERE (first_name,last_name) IN ( ('first_name_1','last_name_1'),('first_name_2','last_name_2'),('first_name_3','last_name_3'),('first_name_4','last_name_4'),('first_name_5','last_name_5'),('first_name_6','last_name_6'),('first_name_7','last_name_7')
);
其他數據庫對多列 IN 查詢的支持情況
多列 IN 并非受所有數據庫支持。根據網上的資料,Oracel 是支持該操作的,但 SQL Server 不支持。其他數據庫的支持情況因筆者沒有測試環境,并未進行測試。