这是一个理论问题,我想知道是否有一种好的方法可以找出WHERE语句中匹配的条件。
假设我有这样的查询:
SELECT * FROM table WHERE
COND1 OR
(COND2 AND COND3) OR
COND4
有什么方法可以知道哪些条件使给定的行匹配(或不匹配)?
我想到的一个解决方案是向 SELECT 添加一个 CASE 子句,然后重新运行该行的所有 WHERE 条件:
SELECT *, which_cond = CASE .... END CASE ...
最佳答案
CASE
是一种可能性。但更短的写法是 IF()
(至少对于 MySQL):
SELECT *, IF(COND2, 1, 0) AS cond2, IF(COND3, 1, 0) as cond3 ...
如果每个 cond*
的值为 1
,则匹配。
当然检查COND1
是否匹配是没有意义的。对于您返回的所有结果,COND1
为真。所以 IF(COND1, 1, 0)
将始终返回 1
(在您的示例中)。
更新:
我发现,至少对于 MySQL,如果您只想获得 1
或 0
作为结果,那么以下内容就足够了:
SELECT *, COND2 AS cond2, COND3 as cond3 ...
关于 Mark 的回答,如果您使用 HAVING
而不是 WHERE
(HAVING
作为访问权限,则可以避免写两次条件到别名):
SELECT *, COND2 AS cond2, COND3 as cond3
FROM table
HAVING COND1 AND (cond2 OR cond3)
(注:大写为实际条件表达式,小写为别名)
更新 2:
嗯,变化不大:您只需检查更新版本中通过 OR
连接的条件,检查 COND2
是否为真或不是。如果是这样,则 COND3
也为真,反之亦然。
SELECT *, COND1 AS cond1, COND2 as cond2, COND4 as cond4
FROM table
HAVING cond1 OR (cond2 AND COND3) OR cond4
我认为这一点很明确。
关于SQL:标记哪个WHERE条件匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2260988/