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)
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,我发现,如果您只想获得1或0作为结果,那么以下内容就足够了:
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)
我认为这一点很清楚。
| 归档时间: |
|
| 查看次数: |
1594 次 |
| 最近记录: |