SQL分组查询存在BOOLEAN TRUE值时仅返回TRUE的实现方法
问题原因
你当前返回两行结果的核心原因如下:
GROUP BY子句中错误加入了逐行计算的PRICE_IND字段,只要同一id+date维度下同时存在匹配关键词、不匹配关键词的记录,就会拆分为TRUE、FALSE两行- 逻辑上没有做组内聚合判断,只是逐行打标签后分组,无法实现“组内存在至少一个TRUE则整体返回TRUE”的需求
- 原SQL的WHERE子句存在语法错误,多写了一个冗余的
AND关键字
实现方案
通用兼容写法(支持所有SQL数据库)
分组维度仅保留id、date,通过聚合函数统计组内符合条件的记录数,只要计数大于0就返回TRUE:
SELECT id, date, CASE WHEN SUM( CASE WHEN ITEM_DESC LIKE '%low_price%' OR ITEM_DESC LIKE '%medium%' OR ITEM_DESC LIKE '%high%' OR ITEM_DESC LIKE '%cheap%' THEN 1 ELSE 0 END ) > 0 THEN 'TRUE' ELSE 'FALSE' END AS PRICE_IND, 'TRUE' AS EXPECTED_RESULT FROM table_1 A JOIN table_2 C ON A.price_ind_id = C.price_ind_id JOIN table_3 U ON C.price_ind_id=U.price_ind_id WHERE id='129342' GROUP BY id, date;
逻辑说明:
- 内层CASE逐行判断ITEM_DESC是否匹配关键词,匹配记为1、不匹配记为0
- SUM对组内所有记录的标记值求和,结果大于0即代表组内至少有1条符合条件的记录,外层CASE直接返回'TRUE',否则返回'FALSE'
- 去掉了冗余的
DISTINCT关键字,GROUP BY本身就会实现按分组维度去重的效果,额外加DISTINCT会增加不必要的计算开销
简洁写法(支持PostgreSQL/Redshift/BigQuery等支持布尔聚合的数据库)
如果你的数据库支持BOOL_OR聚合函数,可以直接用该函数实现组内“存在即真”的判断,写法更简洁:
SELECT id, date, CASE WHEN BOOL_OR( ITEM_DESC LIKE '%low_price%' OR ITEM_DESC LIKE '%medium%' OR ITEM_DESC LIKE '%high%' OR ITEM_DESC LIKE '%cheap%' ) THEN 'TRUE' ELSE 'FALSE' END AS PRICE_IND, 'TRUE' AS EXPECTED_RESULT FROM table_1 A JOIN table_2 C ON A.price_ind_id = C.price_ind_id JOIN table_3 U ON C.price_ind_id=U.price_ind_id WHERE id='129342' GROUP BY id, date;
BOOL_OR的逻辑为:组内只要有1条记录满足括号内的判断条件,就返回布尔TRUE,所有记录都不满足才返回FALSE,完全匹配你的需求。
预期返回结果
执行上述语句后,会按照要求返回单条结果:
| Row | ID | DATE | PRICE_IND | EXPECTED_RESULT |
|---|---|---|---|---|
| 1 | 129342 | 2021-10-02 | TRUE | TRUE |
内容的提问来源于stack exchange,提问作者Sherin Shaziya
相关产品推荐
相关产品推荐

