SQL CASE语句语法错误:无法根据order_state切换SELECT查询的问题
解决PostgreSQL中CASE语句的语法错误问题
首先,咱们来梳理下你代码里的两个核心问题:
1. CASE表达式的结构用错了
你把简单CASE和搜索CASE的写法混在一起了。简单CASE是用来匹配某个字段的具体值,而你需要的是判断order_state IS NULL这个条件,得用搜索CASE的结构——也就是CASE WHEN 条件 THEN ...,而不是CASE 字段 WHEN 条件 THEN ...。
2. THEN/ELSE里不能直接嵌套SELECT语句
CASE表达式是用来返回单个值的,不是用来执行整条查询的。你想返回data字段的话,直接写data就行,不需要套一层SELECT data from result_orders。
针对你的需求,分两种场景给出解决方案:
场景1:每条记录根据order_state判断返回对应值
如果你的需求是遍历result_orders表的每条记录,当order_state为NULL时返回data,否则返回另一个字段(比如other_data),那正确的写法是:
SELECT CASE WHEN order_state IS NULL THEN data ELSE other_data -- 替换成你实际需要返回的字段/值 END AS result_column FROM result_orders;
场景2:根据表中是否存在非NULL的order_state,执行完全不同的查询
如果你的需求是:只要表中有任何一条记录的order_state不为NULL,就执行查询A;否则执行查询B,那可以用PostgreSQL的PL/pgSQL匿名块来实现:
DO $$ BEGIN -- 先检查表中是否存在order_state不为NULL的记录 IF EXISTS (SELECT 1 FROM result_orders WHERE order_state IS NOT NULL) THEN -- 这里写else对应的查询,比如查询另一个表 SELECT data FROM other_table; -- 替换成你的实际查询 ELSE -- order_state全为NULL时执行的查询 SELECT data FROM result_orders; END IF; END $$;
补充说明
如果你原代码里的ELSE部分也是要返回result_orders的data,那其实根本不需要CASE——直接用WHERE子句筛选order_state IS NULL的记录就行:
SELECT data FROM result_orders WHERE order_state IS NULL;
内容的提问来源于stack exchange,提问作者Alexei
相关产品推荐
相关产品推荐

