Answers:
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), ...) ;
但是,如果在DBMS中尝试使用它,则可能会发现它不起作用。因为并非所有DBMS都实现了(不断发展的)SQL标准的所有功能。这在Oracle,MySQL,Postgres,DB2和HSQLDB的最新版本中有效(在MySQL中没有很好地优化它并且不使用索引,因此除非在5.7中对其进行了修复,否则应避免在其中使用它)。
请参阅有关IN
运算符的 MySQL文档和有关行构造函数的 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文档。
IN
和行构造函数:Postgres的
WHERE EXISTS (SELECT t.col1, t.col2 [FROM DUAL] INTERSECT VALUES(val1, val2), (…, …), …)
。
SELECT *
FROM dbo.Table1 A
WHERE (CAST(Column1 AS VARCHAR(max)) + '-' + CAST(Column2 AS varchar(max)))
NOT IN (SELECT (CAST(Column1 AS VARCHAR(max))
+ '-'
+ CAST(Column2 AS varchar(max)))
FROM Table2)
'a-b', 'c'
和'a', 'b-c'
。对于任何无法转换为的类型,它都会惨败varchar(max)
。
WHERE (x, y) IN (a,b)
?我正在使用MySql。也许我不知道这个结构叫什么。