Oracle SQL中的条件联接仅返回不为null的值

时间:2019-07-25 13:46:43

标签: sql oracle

我有两个表需要联接。

Table A
-----
level, x, y, z


Table B
-------------
a, b, c, d

我需要先加入y = c,z = d,然后加入一个条件。

级别的值可以为1-5。

  • 如果级别= 1,那么我需要加入x = a的地方。
  • 如果级别= 2,那么我需要加入x = b的地方。
  • 如果还有其他水平,那么我不在乎x。无论level的值如何,X都可以为null。

后面是伪代码...

SELECT *
FROM a
join b
on a.y = b.c, a.z = b.d,
case
  when a.level = 1
    then b.a
  when a.level = 2
    then b.b
  else null
end = a.x

由于null = a.x问题,上述方法不起作用。如果我将其更改为

case
  when a.level = 1
    then b.a
  when a.level = 2
    then b.b
  else a.x
end = a.x

仅返回a.x不为null的值。

我该如何解决?

示例:

Table A
-----
1, matt, sam, bob
2, mark, sean, john
5, 1, 2, 3


Table B
-------------
matt, joe, sam, bob
steve, mark, sean, john
4, 5, 2, 3

Results
-----
1, matt, sam, bob, matt, joe, sam, bob
2, mark, sean, john, steve, mark, sean, john
5, 1, 2, 3, 4, 5, 2, 3

2 个答案:

答案 0 :(得分:2)

请勿使用case。只需使用布尔比较:

select *
from a join b
     on a.y = b.c and
        a.z = b.d and
        ( (a.level = 1 and a.x = b.a) or
          (a.level = 2 and a.x = b.b) or
          (a.level not in (1, 2))
        )

如果您确实使用case,则需要意识到NULL将导致比较失败。您需要使用a.x进行比较(通常,但a.xNULL时不需要)。

答案 1 :(得分:0)

在您的CASE语句中添加条件a.level is nullor组合:

SELECT * FROM a JOIN b
on a.y = b.c and a.z = b.d and (
  a.level is null 
  or
  a.x = case a.level
    when 1 then b.a
    when 2 then b.b
  end 
)

请参见demo
结果:

> level | X    | Y    | Z    | A     | B    | C    | D   
> ----: | :--- | :--- | :--- | :---- | :--- | :--- | :---
>     1 | matt | sam  | bob  | matt  | joe  | sam  | bob 
>     2 | mark | sean | john | steve | mark | sean | john
相关问题