如何在PostgreSQL中使用CASE WHEN实现条件表关联?
实现PostgreSQL中根据rateid条件动态关联表
你原来的CASE写法在PostgreSQL里是不合法的,CASE语句无法用来返回不同结构的查询结果集,可采用以下两种可行方案实现需求:
方案一:LEFT JOIN 条件关联(推荐)
通过LEFT JOIN结合关联条件,实现rateid>100时才关联hotel表,否则hotel表字段返回NULL:
SELECT A.*, B.*, C.*, D.* FROM rate AS A JOIN plan AS B ON A.id = B.rateid JOIN room AS C ON B.roomid = C.id LEFT JOIN hotel AS D ON C.hotelid = D.id AND A.id > 100;
逻辑说明:
- 当
A.id > 100时,LEFT JOIN会正常关联hotel表,返回对应的hotel字段值 - 当
A.id <= 100时,hotel表的所有字段会返回NULL,等同于未关联该表
方案二:UNION ALL 拆分查询(需保证列一致)
如果要求rateid<=100时完全不返回hotel表的字段,可使用UNION ALL拆分两个查询,但必须保证两个分支的列数、数据类型完全匹配:
-- 分支1:rateid<=100,不关联hotel表 SELECT A.*, B.*, C.*, NULL::INT AS hotel_id, NULL::VARCHAR AS hotel_name -- 按hotel表实际字段补充对应类型的NULL FROM rate AS A JOIN plan AS B ON A.id = B.rateid JOIN room AS C ON B.roomid = C.id WHERE A.id <= 100 UNION ALL -- 分支2:rateid>100,关联hotel表 SELECT A.*, B.*, C.*, D.id AS hotel_id, D.name AS hotel_name FROM rate AS A JOIN plan AS B ON A.id = B.rateid JOIN room AS C ON B.roomid = C.id JOIN hotel AS D ON C.hotelid = D.id WHERE A.id > 100;
注意:需要根据hotel表的实际字段调整NULL的类型和数量,确保两个查询的结构一致。
内容的提问来源于stack exchange,提问作者Nirodha Wickramarathna
相关产品推荐
相关产品推荐

