SQL:忽略WHERE子句中的条件

时间:2019-09-27 16:45:26

标签: sql oracle

我对如何排除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;

1 个答案:

答案 0 :(得分:0)

我认为您可以结合使用:

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语法。它已经存在了20多年了:

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;