SQL:标记哪个 WHERE 条件匹配

Ami*_*shk 2 mysql sql sql-server oracle

这是一个理论问题,我想知道是否有一个好的方法来找出 WHERE 语句中的哪个条件匹配。

假设我有一个这样的查询:

SELECT * FROM table WHERE
    COND1 OR
    (COND2 AND COND3) OR
    COND4
Run Code Online (Sandbox Code Playgroud)

有什么方法可以知道哪些条件使给定的行匹配(或不匹配)?


我想到的一个解决方案是向 SELECT 添加 CASE 子句,并重新运行该行的所有 WHERE 条件:

SELECT *, which_cond = CASE .... END CASE ...
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 5

CASE是一种可能性。但写起来会更短IF()(至少对于MySQL):

SELECT *, IF(COND2, 1, 0) AS cond2, IF(COND3, 1, 0) as cond3 ... 
Run Code Online (Sandbox Code Playgroud)

cond*如果其值为 ,则每个都匹配1

COND1当然,检查是否匹配是没有意义的。对于您返回的所有结果,COND1都是正确的。所以IF(COND1, 1, 0)总是会返回1(在你的例子中)。

更新
至少对于 MySQL,我发现,如果您只想获得10作为结果,那么以下内容就足够了:

SELECT *, COND2 AS cond2, COND3 as cond3 ...
Run Code Online (Sandbox Code Playgroud)

关于马克的回答,如果您使用HAVING而不是WHERE(HAVING作为对别名的访问),则可以避免将条件写两次:

SELECT *, COND2 AS cond2, COND3 as cond3
FROM table
HAVING COND1 AND (cond2 OR cond3)
Run Code Online (Sandbox Code Playgroud)

(注:大写为实际条件表达式,小写为别名)

更新2:

好吧,它的变化并没有那么大:您只需检查OR更新版本中连接的条件,就足以检查是否COND2正确。如果是这样,那么COND3也是如此,反之亦然。

SELECT *, COND1 AS cond1, COND2 as cond2, COND4 as cond4
FROM table
HAVING cond1 OR (cond2 AND COND3) OR cond4
Run Code Online (Sandbox Code Playgroud)

我认为这一点很清楚。