首页 > 解决方案 > SQL:忽略 WHERE 子句中的条件

问题描述

如果 WHERE 子句的评估结果为 NULL,我对如何排除其中一个条件感到困惑

SELECT TB1.COL3 
FROM TB1, TB2
WHERE TB1.COL1 = TB2.Col1
AND TB2.COL1 = '12345'
AND (TB2.COL3 = (SELECT MIN(TB3.COL4)
FROM TB3
WHERE COL1 = TB2.COL1
AND COL2 in ('A', 'B') 
AND COL4 IN (SELECT COL3 FROM TB4 
WHERE COL1 = TB4.COL1))) 
AND ROWNUM = 1;

如果以下条件 SELECT MIN(TB3.COL4) FROM TB3 评估为除 NULL 之外的某个值,我如何修改上述查询以忽略“AND 条件 TB2.COL3”。如果为 NULL,则上述查询应按如下方式执行:

SELECT TB1.COL3 
FROM TB1, TB2
WHERE TB1.COL1 = TB2.Col1
AND TB2.COL1 = '12345'
AND ROWNUM = 1;

标签: sqloracle

解决方案


我认为您可以通过合并来实现这一目标:

SELECT TB1.COL3 
FROM TB1, TB2
WHERE TB1.COL1 = TB2.Col1
AND TB2.COL1 = '12345'
AND (TB2.COL3 = COALESCE((SELECT MIN(TB3.COL4)
FROM TB3
WHERE COL1 = TB2.COL1
AND COL2 in ('A', 'B') 
AND COL4 IN (SELECT COL3 FROM TB2 
WHERE COL1 = TB2.COL1)), TB2.COL3)) 
AND ROWNUM = 1;

在这里,我们只是包装了 SELECT 语句COALESCE,如果它返回 null,将获取第二个参数的值,这与我们正在比较的列相同。既然TB2.COL3 = TB2.COL3显然TRUE那么这个过滤器不会对结果集产生任何影响。

此外,通常建议您停止在 FROM 子句中使用逗号并使用正确的 JOIN 语法。它已经存在了 2 多年了:

SELECT
    TB1.COL3
FROM
    TB1
    INNER JOIN TB2
        ON TB1.COL1 = TB2.Col1
WHERE
    TB2.COL1 = '12345'
    AND
    (
        TB2.COL3 = COALESCE
        (
            (
                SELECT
                    MIN(TB3.COL4)
                FROM
                    TB3
                WHERE
                    COL1 = TB2.COL1
                    AND COL2 in ('A', 'B')
                    AND COL4 IN
                    (
                        SELECT
                            COL3
                        FROM
                            TB2
                        WHERE
                            COL1 = TB2.COL1
                    )
            ),
            TB2.COL3
        )
    )
    AND ROWNUM = 1;

推荐阅读