sql - 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;
解决方案
我认为您可以通过合并来实现这一目标:
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;
推荐阅读
- sql - 将数组数据类型添加到sql数据库
- pyspark - pyspark:如何在 `val` 是 python 中的变量的计算中使用多个`lit(val)`?
- java - 有什么方法可以在 google face detection ML Kit 中检测到超过 12 个地标点
- apache-flink - 无法通过 curl 请求使用 post 请求在 Flink 中提交作业(请求不匹配...)
- ionic-framework - 是否有任何可以与离子框架集成的健康/健身乐队?
- sql - 违反主键约束“PK__Transact__”。无法在对象“dbo.Transactions_ID”中插入重复键。重复键值为 (1001)
- python - 如何在 PyQt5 中旋转标签或按钮?
- c++ - 通过引用传递向量内联
- google-bigquery - 基于嵌套列对 BigQuery 表进行分区
- angularjs - 类型'typeof Observable'.ts(2339)上不存在属性'of'