PostgreSQL中如何用IF语句关联另一张表更新表数据?
在PostgreSQL中实现需求的更新语句
你的需求是更新table1的column9字段,统计table1的a、b、c三个字段分别在table2的a、b、c列中是否存在匹配(只要有至少一个匹配就算1),最后将这三个统计值求和赋值给column9。以下是正确的实现方式:
方法1:使用EXISTS判断(性能更优)
EXISTS会在找到第一个匹配项后立即停止查询,比全表求和效率更高:
UPDATE table1 t1 SET column9 = -- 判断t1.a是否在t2的a/b/c列中有匹配 CASE WHEN EXISTS( SELECT 1 FROM table2 t2 WHERE t2.a = t1.a OR t2.b = t1.a OR t2.c = t1.a ) THEN 1 ELSE 0 END + -- 判断t1.b是否在t2的a/b/c列中有匹配 CASE WHEN EXISTS( SELECT 1 FROM table2 t2 WHERE t2.a = t1.b OR t2.b = t1.b OR t2.c = t1.b ) THEN 1 ELSE 0 END + -- 判断t1.c是否在t2的a/b/c列中有匹配 CASE WHEN EXISTS( SELECT 1 FROM table2 t2 WHERE t2.a = t1.c OR t2.b = t1.c OR t2.c = t1.c ) THEN 1 ELSE 0 END;
方法2:使用SUM求和判断(贴近你原思路)
如果要贴合你原SQL中“求和后判断是否大于0”的逻辑,可以用SUM统计匹配次数,再判断是否大于0:
UPDATE table1 t1 SET column9 = CASE WHEN ( SELECT SUM( CASE WHEN t2.a = t1.a OR t2.b = t1.a OR t2.c = t1.a THEN 1 ELSE 0 END ) FROM table2 t2 ) > 0 THEN 1 ELSE 0 END + CASE WHEN ( SELECT SUM( CASE WHEN t2.a = t1.b OR t2.b = t1.b OR t2.c = t1.b THEN 1 ELSE 0 END ) FROM table2 t2 ) > 0 THEN 1 ELSE 0 END + CASE WHEN ( SELECT SUM( CASE WHEN t2.a = t1.c OR t2.b = t1.c OR t2.c = t1.c THEN 1 ELSE 0 END ) FROM table2 t2 ) > 0 THEN 1 ELSE 0 END;
原SQL的问题说明
- PostgreSQL中没有
IF语句(SQL层面需用CASE表达式替代); - 原语句中
sum(a=table2.a + a=table2.b + a=table2.c)的写法错误:布尔表达式a=table2.a在PostgreSQL中返回true/false,不能直接用+运算,需用CASE转成整数后再求和; - 缺少表关联逻辑,原SQL没有明确关联
table1和table2,无法针对table1的每一行做匹配判断。
内容的提问来源于stack exchange,提问作者Gulya
相关产品推荐
相关产品推荐

