在左联接中创建标志

时间:2018-10-22 14:06:02

标签: sql oracle join

由于下面的左连接,我正在尝试为“空”行创建新列(一种标识符标志):

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

当我不尝试使用“ case when”时,此代码正常运行。实际上,您完全可以忽略第一个左连接。

我的目的是能够在执行此操作的同时测试左联接结果,并根据结果采取行动:

如果左连接结果给出空行:为该行创建一个标志列

如果左连接结果给出正常行:左连接正常完成,并且标志列为空(因为我怀疑它不存在)。

如果您能帮助我,我会很高兴!

EDIT:表格示例:

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 |

3 个答案:

答案 0 :(得分:2)

只需使用

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 )

答案 1 :(得分:2)

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中构建的,因此请注意语法,但在逻辑上它的工作方式相同

答案 2 :(得分:1)

为什么要加入?看来您只想在其他表中查找要使用EXISTSIN的数据:

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;