如果过滤器后值不匹配,则返回null

时间:2018-08-08 16:37:58

标签: sql db2

在使用where子句后,如果有人不匹配join子句,有人知道如何返回null的行吗?

我有两个表,分别称为A和B。

示例:

TABLE A                    TABLE B 
COL1  COL2                COL1   COL2  COL3  COL 4         
A       1                 A       1     sd    01/02
B       2                 B       2     aa    01/05
C       3                 C       3     bb    01/07

我使用以下查询:

SELECT * 
FROM TABLE A as a 
LEFT JOIN TABLE B as b ON a.COL1 = b.COL1 AND a.COL2 = b.COL2 

我得到的结果是

    COL1  COL2    COL1.2   COL2.2  COL3  COL4         
     A       1      A       1     sd    01/02
     B       2      B       2     aa    01/05
     C       3      C       3     bb    01/07

现在,当我添加此where子句时:

SELECT * 
FROM TABLE A as a 
LEFT JOIN TABLE B as b ON a.COL1 = b.COL1 AND a.COL2 = b.COL2 
WHERE COL4 >= '01/05'

我明白了:

    COL1  COL2    COL1.2   COL2.2  COL3  COL4         
     B       2      B       2      aa    01/05
     C       3      C       3      bb    01/07         

我的问题是如何获取查询以代替此显示:

    COL1  COL2    COL1.2   COL2.2  COL3  COL4         
     A      NULL   NULL    NULL    NULL  NULL
     B       2      B       2      aa    01/05
     C       3      C       3      bb    01/07

任何帮助或想法将不胜感激。

谢谢

3 个答案:

答案 0 :(得分:0)

有一个奇怪的请求吗?我可以问一下,当where子句明确声明要排除NULL值时,为什么要将行返回为NULL吗?如果可以提供更多详细信息,我可以帮助您找到更好的方法。

答案 1 :(得分:0)

您将不得不对包含COL1的唯一值的表使用外部联接。如果没有这样的表格,则可能会使用CTE:

with categories as (
  select distinct col1
    from a)
select categories.col1, a.col2, b.col1, b.col2, b.col3, b.col4
  from categories
    left outer join 
        (a join b on a.col1 = b.col1 and a.col2 = b.col2 and b.col4 >= '01/05')
      on categories.col1 = a.col1

魔术在嵌套连接中。该联接中提供了原始查询,但是如果您需要除所有具有值的COL1值之外的所有遗漏值,则需要将原始查询与有效COL1值的列表联接起来。因此,该语句使用公用表表达式(CTE),即with子句,并使用左外部联接将其与原始查询联接,即嵌套联接。

附加说明,OUTER是不必要的,因为在指定连接类型LEFTRIGHTFULL时隐含了这一点,我只是想明确一点

答案 2 :(得分:0)

只需将条件移至on子句。它在left join的第二个表上:

SELECT * 
FROM TABLE A a LEFT JOIN
     TABLE B b
     ON a.COL1 = b.COL1 AND a.COL2 = b.COL2 and b.COL4 >= '01/05';