这可能是一个愚蠢的问题,我怀疑我不能这样做,但是 SQL 中是否有一个结构可以让我执行以下操作:
SELECT whatever WHERE col1,col2 IN ((val1, val2), (val1, val2), ...)
Run Code Online (Sandbox Code Playgroud)
我想选择两列在一组对中的数据。
如果可能,我想避免使用子查询。
ype*_*eᵀᴹ 63
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), ...) ;
Run Code Online (Sandbox Code Playgroud)
但是,如果您在 DBMS 中尝试它,您可能会发现它不起作用。因为并非所有 DBMS 都实现了(不断发展的)SQL 标准的所有功能。这适用于最新版本的 Oracle、MySQL、Postgres、DB2 和 HSQLDB(它在 MySQL 中没有得到很好的优化并且没有使用索引,所以应该避免在那里使用,除非他们在 5.7 中修复它)。
请参阅有关IN运算符的MySQL 文档和有关Row 构造函数的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) ;
Run Code Online (Sandbox Code Playgroud)
两者都适用于 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 ;
Run Code Online (Sandbox Code Playgroud)
通过首先将值放入(临时或永久)表中,它也可以修改为在任何地方工作:
-- 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 ;
Run Code Online (Sandbox Code Playgroud)
并且总是有很长的路要走,或者将 转换IN为长表达式,OR它应该在任何地方都有效:
-- works in all SQL DBMS
SELECT whatever
FROM t
WHERE col1 = val1a AND col2 = val2a
OR col1 = val1b AND col2 = val2b
---
;
Run Code Online (Sandbox Code Playgroud)
*:它实际上可以只是一个值,带有ROW(v),请参阅 Postgres 文档。
| 归档时间: |
|
| 查看次数: |
90323 次 |
| 最近记录: |