我有两个表需要联接。
Table A
-----
level, x, y, z
Table B
-------------
a, b, c, d
我需要先加入y = c,z = d,然后加入一个条件。
级别的值可以为1-5。
后面是伪代码...
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
答案 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.x
为NULL
时不需要)。
答案 1 :(得分:0)
在您的CASE语句中添加条件a.level is null
与or
组合:
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