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