postgresql 左连接(如果满足条件),设置为空

fykwrbwg  于 2022-11-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(250)

我正在尝试为下面的表编写SQL连接查询。
我正在尝试获得预期表
唯一的连接条件是,如果在表1中,操作的值是'D',即删除,则表2中相应行的值应为空。
基于键联接的表。
数据库:帖子

表1

id | operation| keys|
-----------------------
1  | I        | 1   |
2  | U        | 2   |
3  | D        | 3   |

表二

id |keys| col1| col2
-----------------------
1  | 1  | xyz | abc
2  | 2  | yxz | cba
3  | 3  | zxy | bac

预期输出

id | operation| keys| col1| col2
---------------------------------
1  | I        | 1   | xyz |abc
2  | U        | 2   | yxz |cba
3  | D        | 3   | NULL|NULL
hfyxw5xn

hfyxw5xn1#

您可以使用CASE WHEN来得到您想要的结果。基本上,查询看起来如下:

SELECT t1.id, t1.operation, t1.keys,
CASE WHEN t1.operation = 'D' THEN NULL ELSE t2.col1 END col1,
CASE WHEN t1.operation = 'D' THEN NULL ELSE t2.col2 END col2
FROM table1 t1 
LEFT JOIN table2 t2 ON t1.id = t2.id
AND t1.keys = t2.keys;

我不知道你是否真的想做左连接,或者你是否需要一个内连接。我也不知道你是否会同时连接id和keys列,或者只连接其中的一列。所以查询会产生你的例子所期望的结果,但是你必须检查这些东西,请。最后注意:当然,您甚至可以删除“CASE WHEN”结构,并将!= 'D'条件放在左连接中。我没有提出这样做,因为“CASE WHEN”结构允许您在必要时为col 1和col 2选择不同的值,因此更加灵活。

polkgigr

polkgigr2#

我想你可以用正确的条件写一个left join语句,在这个例子中是table_1.keys = table_2.keys and table_1.operation != 'D',这将连接第二个表,你将在条件为false的列中得到null

select t1.*, t2.col1, t2.col2  from table_1 as t1 left join table_2 as t2 on (t1.keys = t2.keys and t1.operation != 'D')

请参阅sqldaddy.io上的演示

相关问题