是否可以写成 (A OR B) IN(X, Y, ..., W) ?
我需要填写两个IN()expr。手动具有相同的值。喜欢:
A IN(X, Y, ..., W) OR B IN(X, Y, ..., W)
Run Code Online (Sandbox Code Playgroud)
IN()只填写一项的最佳选择是什么?
不,没有简单的解决方案,除非这些值已经在各自的(普通或临时)表中。如果他们是,
A IN(X, Y, ..., W) OR B IN(X, Y, ..., W)
Run Code Online (Sandbox Code Playgroud)
很容易重写。它相当于:
EXISTS ( SELECT *
FROM List1 JOIN List2 ON List1.item = List2.item )
Run Code Online (Sandbox Code Playgroud)
如果A和B没有提供值/参数,而是提供查询中涉及的表中的列/表达式,我们可以使用混合方法,仅提供X, Y, ..., W(临时)表中的值:
A IN (SELECT item FROM List2)
OR
B IN (SELECT item FROM List2)
-- alternative 1
EXISTS (SELECT * FROM List2 WHERE List2.item = A)
OR
EXISTS (SELECT * FROM List2 WHERE List2.item = B)
-- alternative 2
EXISTS (SELECT * FROM List2 WHERE List2.item IN (A,B))
Run Code Online (Sandbox Code Playgroud)
如果这些值尚未存在于表中,则可以使用 usingVALUES子句来编写此内容,但这尚未在 mySQL 中实现:
EXISTS ( SELECT *
FROM (VALUES (A), (B)) AS List1 (item)
JOIN
(VALUES (X), (Y), ... (W)) AS List2 (item)
ON List1.item = List2.item )
Run Code Online (Sandbox Code Playgroud)
在 MySQL 中,您必须VALUES使用相当长的子查询来重写UNION
EXISTS ( SELECT *
FROM (SELECT A AS item UNION ALL
SELECT B
) AS List1
JOIN
(SELECT X AS item UNION ALL
SELECT Y UNION ALL
...
SELECT W
) AS List2
ON List1.item = List2.item )
Run Code Online (Sandbox Code Playgroud)