sqlite 如何根据表达式添加布尔列?

1tuwyuhd  于 2022-11-14  发布在  SQLite
关注(0)|答案(2)|浏览(196)

T1
ID|r1|r2|r3
-|-|
ID1|r1_d1|r2_d1|r3_d1
ID2|r1_d2|r2_d2|r3_d2
ID3|r1_d3|r2_d2|r3_d3
Id4|r1_d4|r2_d4|r3_d4
T2
ID|K_r1|K2
-|-|
Id1|r1_d1|k2_d1
Id2|r1_d3|k2_d2
ID3|r1_d4|k2_d4
我需要第一个表的一些属性和一个额外的结果,表明是否T1.R1 == T2.K_R1
ID|R1|R2|P1
-|-|
ID1|r1_d1|r2_d1|TRUE
Id2|R1_D2|R2_D2|FALSE
ID3|r1_d3|r2_d2|true
Id4|r1_d4|r2_d4|TRUE
LEFT JOIN将返回T1的所有条目和匹配的T2条目,但也将具有T2的所有属性,这是不需要的。如何(也考虑到性能)排除不必要的属性并生成布尔值--而不是实际值?

wrrgggsh

wrrgggsh1#

您可以按如下方式使用EXISTS运算符:

SELECT Id, R1, R2,
       EXISTS(SELECT 1 FROM table2 T2 WHERE T2.K_R1 = T1.R1) AS P1
FROM table1 T1
ORDER BY Id, R1

请参见demo

ar5n3qh5

ar5n3qh52#

连接本身不“返回”任何内容,所以我不会担心可以返回的列数。您可以在SELECT子句中准确地放入您想要的内容。
您可以使用CASE语句返回TRUE或FALSE。
也许是这样的:

SELECT 
 t1.id, 
 t1.r1, 
 t1.r2, 
 CASE WHEN t2.id IS NULL THEN 'false' ELSE 'true' END p1
FROM t1 LEFT OUTER JOIN t2
 ON t1.r1 = t2.k_r1

SELECT 
 t1.*, 
 CASE WHEN t2.id IS NULL THEN 'false' ELSE 'true' END p1
FROM t1 LEFT OUTER JOIN t2
  ON t1.r1 = t2.k_r1

这些选项假定T2中最多有一条匹配的记录。如果不是这样,您可能希望在SELECT中使用GROUP BY(带有JOIN),或者在SELECT中使用EXISTS(没有JOIN)。本例中的MAX应该可以工作,因为“true”按字母顺序大于“False”,如果至少有一个“true”,您希望返回“true”。

SELECT 
 t1.id, 
 t1.r1, 
 t1.r2, 
 MAX(CASE WHEN t2.id IS NULL THEN 'false' ELSE 'true' END) p1
FROM t1 LEFT OUTER JOIN t2
 ON t1.r1 = t2.k_r1
GROUP BY t1.id, t1.r1, t1.r2

相关问题