You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL条件查询报错求助:满足特定条件时查询酒店数据

问题分析与解决

语法错误

你的SQL存在两处明确的语法问题:

  1. 第一个查询中,SUM("TotalBookings") AS Availability, 末尾多了一个逗号,这直接触发了syntax error at or near "from"错误,PostgreSQL无法识别后续的FROM子句。
  2. 尝试用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:37:09