为何该SQL查询过滤周一数据时返回0行?请求排查
问题排查与解决
你的问题核心原因是:to_char(install_date, 'Day')返回的星期名字符串带有末尾填充空格(比如PostgreSQL中该格式会自动补空格,让所有星期名长度统一,Monday会变成Monday ),直接用weekday = 'Monday'自然匹配不到。
以下是几种可行的解决办法:
方法一:用TRIM()去除空格
修改CTE中的weekday字段定义,提前去掉字符串两端的空格:WITH cte1 AS (SELECT o.order_id, p.price * o.quantity AS total_spending, TRIM(to_char (install_date, 'Day')) AS weekday FROM orders AS o LEFT JOIN parts AS p using (part_id) LEFT JOIN installs AS i ON o.order_id = i.order_id) SELECT * FROM cte1 WHERE weekday = 'Monday'方法二:使用FMDay格式符(PostgreSQL专属)
FM前缀可以去掉格式输出中的填充空格,直接返回无空格的星期全名:WITH cte1 AS (SELECT o.order_id, p.price * o.quantity AS total_spending, to_char (install_date, 'FMDay') AS weekday FROM orders AS o LEFT JOIN parts AS p using (part_id) LEFT JOIN installs AS i ON o.order_id = i.order_id) SELECT * FROM cte1 WHERE weekday = 'Monday'方法三:在WHERE子句中直接处理(不推荐)
如果不想修改CTE,也可以在过滤条件中对weekday做修剪:WITH cte1 AS (SELECT o.order_id, p.price * o.quantity AS total_spending, to_char (install_date, 'Day') AS weekday FROM orders AS o LEFT JOIN parts AS p using (part_id) LEFT JOIN installs AS i ON o.order_id = i.order_id) SELECT * FROM cte1 WHERE TRIM(weekday) = 'Monday'
另外补充:你用了LEFT JOIN installs,如果部分订单没有对应的安装记录,install_date会为NULL,对应的weekday也会是NULL,这部分数据会被WHERE条件过滤。如果需要包含这类订单,可调整条件为weekday = 'Monday' OR weekday IS NULL,但根据你描述的场景,核心问题还是空格匹配的问题。
内容的提问来源于stack exchange,提问作者Jahnavi Patel
相关产品推荐
相关产品推荐

