Чи є в SQL конструкція, яка б дозволила мені зробити щось на кшталт наступного:
Так, є, майже так, як ви це написали. Просто поставте col1, col2
всередину дужок:
-- works in PostgreSQL, Oracle, MySQL, DB2, HSQLDB
SELECT whatever
FROM t --- you missed the FROM
WHERE (col1, col2) --- parentheses here
IN ((val1a, val2a), (val1b, val2b), ...) ;
Якщо ви спробуєте це в СУБД, ви можете виявити, що він не працює. Тому що не всі СУБД реалізували всі функції (що розвиваються) стандарту SQL. Це працює в останніх версіях Oracle, MySQL, Postgres, DB2 та HSQLDB (вона не була добре оптимізована в MySQL і не використовувала індекси, тому цього слід уникати, якщо вони не зафіксували її в 5.7).
Дивіться документацію MySQL про IN
оператор та документацію Postgres про конструктори рядків . Два значення * (або більше) у дужках називаються конструктором рядків .
Інші способи, що виражають ту саму думку:
-- works in PostgreSQL, DB2
SELECT whatever
FROM t
WHERE (col1, col2)
IN ( VALUES (val1a, val2a), (val1b, val2b), ...) ;
SELECT t.whatever
FROM t
JOIN
( VALUES (val1a, val2a), (val1b, val2b), ...) AS x (col1, col2)
ON (x.col1, x.col2) = (t.col1, t.col2) ;
Обидва працюють у Postgres та DB2 (afaik). Останній може бути змінений і для роботи в SQL Server:
-- works in PostgreSQL, DB2, SQL Server
SELECT t.whatever
FROM t
JOIN
( VALUES (val1a, val2a), (val1b, val2b), ...) AS x (col1, col2)
ON x.col1 = t.col1
AND x.col2 = t.col2 ;
Він також може бути модифікований для роботи скрізь, помістивши спочатку значення в (тимчасову чи постійну) таблицю:
-- works everywhere
CREATE TABLE values_x
( col1 ...,
col2 ...) ;
-- use appropriate for the DBMS syntax here
INSERT INTO values_x (col1, col2)
VALUES (val1a, val2a), (val1b, val2b), ... ;
SELECT t.whatever
FROM t
JOIN values_x x
ON x.col1 = t.col1
AND x.col2 = t.col2 ;
DROP TABLE values_x ;
І завжди існує довгий шлях або перетворення на IN
довгий вираз із тим, OR
що має працювати всюди:
-- works in all SQL DBMS
SELECT whatever
FROM t
WHERE col1 = val1a AND col2 = val2a
OR col1 = val1b AND col2 = val2b
---
;
*: Насправді це може бути лише одне значення ROW(v)
, див. Документи Postgres.
WHERE (x, y) IN (a,b)
? Я використовую MySql. Можливо, я не знаю, як називається ця конструкція.