PostgreSQL CASE语句能否嵌套SELECT?如何按表行数查询数据?
问题解答
1. CASE语句的THEN块中是否允许使用SELECT语句?
可以,但仅允许返回单个值的标量子查询。CASE是一个表达式,它的每个THEN/ELSE分支必须返回单一的、数据类型兼容的值,不能返回多行或多列的结果集。你之前的错误就是因为在THEN/ELSE里用了SELECT *,这会返回table2的所有列和多行数据,不符合CASE表达式的要求,所以触发语法错误。而你测试的示例里返回的是单个字符串,符合要求,所以能正常运行。
2. 如何编写PostgreSQL查询,基于另一表的行数结果来查询数据?
根据你的需求,这里提供三种常用的实现方式:
方式一:使用UNION ALL结合条件判断
利用UNION ALL将两个查询结果合并,同时通过条件控制只返回符合要求的那一组数据:
SELECT * FROM table2 WHERE partner = '12345' AND (SELECT count(*) FROM table1 WHERE objectid = '0000016') > 0 UNION ALL SELECT * FROM table2 WHERE partner = '67890' AND (SELECT count(*) FROM table1 WHERE objectid = '0000016') = 0;
方式二:使用WHERE子句结合EXISTS(更高效)
如果只需要判断table1中是否存在符合条件的记录(而非精确计数),用EXISTS会比COUNT(*)更高效,因为EXISTS在找到第一条匹配记录后就会停止查询:
SELECT * FROM table2 WHERE (EXISTS(SELECT 1 FROM table1 WHERE objectid = '0000016') AND partner = '12345') OR (NOT EXISTS(SELECT 1 FROM table1 WHERE objectid = '0000016') AND partner = '67890');
方式三:使用CTE提前计算条件
如果条件需要多次引用,可以用CTE先计算判断结果,再在主查询中使用:
WITH condition_check AS ( SELECT EXISTS(SELECT 1 FROM table1 WHERE objectid = '0000016') AS has_data ) SELECT t2.* FROM table2 t2, condition_check cc WHERE (cc.has_data AND t2.partner = '12345') OR (NOT cc.has_data AND t2.partner = '67890');
内容的提问来源于stack exchange,提问作者Bhagvat Lande
相关产品推荐
相关产品推荐

