PostgreSQL社区版查询报错:boolean > numeric运算符不存在
问题根源分析
这个报错的核心是你误用了BETWEEN ... AND ...的SQL语法:你把布尔表达式s.wk_id > [2周前的周ID]放在了AND后面的位置,而BETWEEN要求两个参数必须是数值型的边界值,不能是布尔条件。PostgreSQL社区版对语法规则的检查更严格,所以直接抛出了类型不匹配的错误;而企业版可能存在特殊的兼容解析逻辑,忽略了这个语法问题。
修正后的查询语句(两种常见业务逻辑)
我先帮你把语句修正为符合标准SQL的写法,同时优化了周ID的生成方式,让代码更简洁易读:
逻辑1:筛选wk_id大于等于9周前,且大于2周前的记录
因为2周前的周ID数值肯定比9周前的大(更近的周,周ID更高),这个逻辑其实等价于s.wk_id > [2周前的周ID],但如果你确实需要保留双重条件,可以用下面的写法:
WITH week_calculations AS ( SELECT -- 用ISO格式直接生成周ID(年份+两位周数),替代原有的拼接逻辑 to_char(now() - interval '9 week', 'IYYYIW')::numeric AS wk_9_ago, to_char(now() - interval '2 week', 'IYYYIW')::numeric AS wk_2_ago ) SELECT count(*) FROM cdar_cpms_owner.hshldgrp_wkly_actvty s CROSS JOIN week_calculations wc WHERE s.wk_id >= wc.wk_9_ago AND s.wk_id > wc.wk_2_ago;
逻辑2:筛选wk_id在9周前到2周前之间的记录(包含两端边界)
如果这才是你的真实业务需求,那么应该使用标准的BETWEEN语法:
WITH week_calculations AS ( SELECT to_char(now() - interval '9 week', 'IYYYIW')::numeric AS wk_9_ago, to_char(now() - interval '2 week', 'IYYYIW')::numeric AS wk_2_ago ) SELECT count(*) FROM cdar_cpms_owner.hshldgrp_wkly_actvty s CROSS JOIN week_calculations wc WHERE s.wk_id BETWEEN wc.wk_9_ago AND wc.wk_2_ago;
额外优化说明
我把周ID的生成方式改成了to_char(..., 'IYYYIW'),这比你原来的extract拼接写法更简洁,逻辑完全一致:IYYY是ISO标准的四位年份,IW是ISO标准的两位周数,直接组合成字符串再转数值即可,不需要手动处理trim和格式拼接。
内容的提问来源于stack exchange,提问作者Saurabh wagh
相关产品推荐
相关产品推荐

