我正在尝试为以下左连接产生的"Null"行创建一个新列(一种标识符标志(:
with CTE (...) as (
... unrelated code
) select * from CTE
left join (select columnID from table1) Pu
on CTE.columnID = Pu.columnID
left join (select case when bz.column2 is null then 'null test is working' else columnID2, column2 end FROM table2) Bz
ON CTE.columnID2 = Bz.columnID2
当我不尝试使用"案例何时"时,此代码工作正常。实际上,您完全可以忽略第一个左连接。
我的目的是能够在执行此操作时测试左连接结果,并根据结果采取行动:
如果左连接结果给出空行:为该行创建一个标志列,
如果左连接结果给出一个正常的行:左连接正常完成,标志列为空(因为我怀疑它不可能不存在(。
如果你能帮我一把,我会很高兴的!
编辑:表格示例:
CTE
| columnID | columnID2 | InformationsCTE |
| ab | mp | randominfo1 |
| ac | ma | randominfo2 |
| ae | me | randominfo3 |
| ad | mb | randominfo4 |
table2
| columnID2 | InformationsTable2 |
| mp | randominfo5 |
| ma | randominfo6 |
| me | randominfo7 |
第二个左连接后的结果:
new CTE
| columnID | columnID2 | InformationsCTE | InformationsTable2| FLAG |
| ab | mp | randominfo1 | randominfo5 | OK |
| ac | ma | randominfo2 | randominfo6 | OK |
| ae | me | randominfo3 | randominfo7 | OK |
| ad | mb | randominfo4 | NULL | NOK |
只需使用
T-SQL:
SELECT ISNULL(Column_to_check,'flag') FROM SomeTable
PL/SQL:
SELECT NVL(Column_to_check,'flag') FROM SomeTable
如果要从Column_to_check返回其他值,也可以使用 NVL2,如下所示:
NVL2(Column_to_check, value_if_NOT_null, value_if_null )
SELECT
此列,使用ISNULL
运算符并仅使用简单的LEFT JOIN
不是更实用吗?我觉得你把它复杂化了一点。
像这样:
with CTE (...) as (
... unrelated code
)
SELECT CTE.*, NVL(bz.InformationsTable2, 'TEST OK')
FROM CTE
LEFT JOIN table2 Bz ON CTE.columnID2 = Bz.columnID2
编辑:根据您的示例表,如果您在 ID 上联接,然后在另一列上使用 NVL,它应该适合您。
这是我为上一个问题准备的示例:SQL Fiddle
示例是在mysql中构建的,因此请注意语法,但从逻辑上讲,它的工作方式相同
为什么要连接?您似乎只想在其他表中查找数据,为此您将使用EXISTS
或IN
:
with cte (...) as (
... unrelated code
)
select
cte.*,
case when columnid in (select columnid from table1) then 'okay' else 'fail' end as test1,
case when columnid2 in (select columnid2 from table2) then 'okay' else 'fail' end as test2
from cte;