sql - 在 on 子句中使用“and”进行自连接
问题描述
假设我有这个查询:
SELECT
A.ID
, case WHEN B.Col2 IS NULL then 0 else b.Col2 end AS Newcol
FROM TableA as A
LEFT join TableA as B
on A.ID = B.ID and B.col1 = 'Something'
ID 是唯一的。
我不认为在上面做一个 join 是必要的,我们可以简单地通过在 中使用 a 来选择相同的case when
结果select
:
SELECT
ID
, case WHEN Col1 != 'Something' then 0 else Col2 end AS Newcol
FROM TableA
解决方案
构建一个包含表中每种可能类型的值的演示表总是一个好主意,这样您就可以检查重写的结果是否相同。
Col1 is null
如果或 if ,您的重写将不会返回相同的结果col1 ='Something' and col2 is null
。但是,您可以这样做:
SELECT
A.ID
, case WHEN (a.col1 <> 'Something' or a.col1 is null or a.col2 is null) then 0 else a.col2 end AS Newcol
FROM TableA as A
或(更简单)
SELECT
A.ID
, case WHEN a.col1 = 'Something' then coalesce(a.Col2,0) else 0 end AS Newcol
FROM TableA as A
(当然我假设 ID 是你的表的主键,我认为我从来没有遇到过一个没有 ID 列的表)
推荐阅读
- spring-boot - Spring Boot 测试的自动重启
- python - Python - 如何在使用打字机效果时居中对齐文本
- html - 为什么网格项目没有移动到最后?
- c++ - What does cin >> x evaluate to, on error?
- angular - Angular Bootstrap 折叠:如何在另一个折叠打开时关闭一个折叠
- laravel - 无法在 Laravel 5.8 中安装 Spatie Activity-log 包
- android - 如何使用 Kotlin dsl gradle 启用代码覆盖率?
- java - 如何指定嵌套属性的默认值?
- tensorflow - 在 GCP 上运行 TensorFlow 应用程序的最佳实践?
- r - 使用 dplyr 和 rowwise 采样