SQL:标记哪个WHERE条件匹配

标签 sql mysql sql-server oracle

这是一个理论问题,我想知道是否有一种好的方法可以找出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,如果您只想获得 10 作为结果,那么以下内容就足够了:

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/

相关文章:

mysql - 从单个表中获取前 10 个最近更新或创建的记录

mysql - 按总值(value)计算

sql-server - 无序读取列会返回不正确的值(SQL Server ODBC 驱动程序)

python - 如何使用 Python 成功地将从 MySQL 表中选择的行列插入到目标 MSSQL 表中?

c# - 不可为空的System.DateTime的值

mysql - 如何使用mysql的sum()函数计算每一行的总和?

sql - 甲骨文SQL事业部

MySql 字符串替换查询不起作用

php - 在 GROUP BY 中使用 LIMIT 为每个动态组获取 N 个结果

PHP 多图像输入表单未将图像输入 MySQL 表列