是否可以写(A OR B) IN(X, Y, ..., W)?

mvo*_*sek 3 mysql syntax

是否可以写成 (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()只填写一项的最佳选择是什么?

ype*_*eᵀᴹ 5

不,没有简单的解决方案,除非这些值已经在各自的(普通或临时)表中。如果他们是,

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)

如果AB没有提供值/参数,而是提供查询中涉及的表中的列/表达式,我们可以使用混合方法,仅提供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)