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