【发布时间】:2020-01-28 00:26:01
【问题描述】:
如果 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;
【问题讨论】:
-
查询很混乱。在
SELECT COL3 FROM TB2 WHERE COL1 = TB2.COL1中,您缺少一个限定符。它被评估为SELECT COL3 FROM TB2 WHERE TB2.COL1 = TB2.COL1,因为 TB2 是您在子查询中使用的表。由于 TB2.COL1 = TB2.COL1` 始终为真,但 null 除外,因此您最终会得到SELECT COL3 FROM TB2 WHERE TB2.COL1 IS NOT NULL。这是故意的吗? -
附带说明:逗号分隔的连接在 1992 年的 SQL 中变得多余。请使用显式连接 (
FROM TB1 INNER JOIN TB2 ON ...)。然后,当查询全部为大写时,就很难阅读。要么将关键字保留为大写,要么将其全部小写。然后,由于缺少缩进,您的查询不是很可读。第一个子查询在哪里开始和结束,第二个在哪里?最后:一定要加入TB2吗?你没有从中选择,所以我宁愿期待IN或EXISTS。使用连接,您可能会冒得到重复结果行的风险。 -
@ThorstenKettner 我已经修改了将 TB2 替换为 TB4 的 SQL 以防止混淆。