PostgreSQL条件查询报错求助:满足特定条件时查询酒店数据
问题分析与解决
语法错误
你的SQL存在两处明确的语法问题:
- 第一个查询中,
SUM("TotalBookings") AS Availability,末尾多了一个逗号,这直接触发了syntax error at or near "from"错误,PostgreSQL无法识别后续的FROM子句。 - 尝试用
CASE表达式条件执行SELECT语句,但CASE是表达式,仅能返回单个值,不能作为控制流语句触发完整查询执行,这种写法不符合SQL语法规范。
逻辑问题
计算逻辑存在反向错误:
当前子查询中,第一个分支统计指定日期的预订数(正值),第二个分支统计酒店总房间数并取负数,最终SUM结果为预订数 - 总房间数。若该值>=1,意味着预订数超过总房间数,这和“有可用房间时展示酒店信息”的需求完全相悖。正确逻辑应计算总房间数 - 预订数,当结果>=1时,说明存在可用房间。
修正后的SQL示例
方法一:使用CTE计算可用房间数
WITH RoomAvailability AS ( -- 统计指定酒店的总房间数 SELECT COUNT(*) AS total_rooms FROM rooms WHERE hotel_id = 2 UNION ALL -- 统计指定日期已预订房间数(取负数,求和后得到可用房间数) SELECT -COUNT(*) FROM bookings WHERE hotel_id = 2 AND '2023-02-10' BETWEEN SYMMETRIC check_in_date AND check_out_date ) SELECT h.* FROM hotels h JOIN (SELECT SUM(total_rooms) AS available FROM RoomAvailability) calc ON calc.available >= 1 WHERE h.hotel_id = 2;
方法二:使用EXISTS子查询判断
SELECT * FROM hotels WHERE hotel_id = 2 AND EXISTS ( SELECT 1 FROM ( SELECT COUNT(*) AS cnt FROM rooms WHERE hotel_id = 2 UNION ALL SELECT -COUNT(*) FROM bookings WHERE hotel_id = 2 AND '2023-02-10' BETWEEN SYMMETRIC check_in_date AND check_out_date ) t HAVING SUM(cnt) >= 1 );
两种写法均能实现需求:仅当指定酒店在2023-02-10有至少1间可用房间时,返回该酒店信息。
内容的提问来源于stack exchange,提问作者Kyle Ghilotti
相关产品推荐
相关产品推荐

