使用含IN条件的CASE语句SQL查询Druid时出现执行错误
解决Druid查询中CASE WHEN + IN子句的错误问题
看起来你在Druid里使用带IN子句的CASE表达式时触发了解析错误,这个问题通常和数据类型不匹配或者Druid SQL解析器的语法兼容性有关,下面是具体的排查和解决步骤:
1. 检查字段数据类型匹配性
首先确认sale_mode字段的数据类型:
- 如果
sale_mode是字符串类型,你当前写的in (1,2,3)是用数字和字符串做比较,这会触发类型不匹配的问题。需要把IN里的值改成字符串形式:
SELECT CASE WHEN sale_mode in ('1','2','3') THEN 'a' ELSE 'b' END AS type FROM "20051001" WHERE __time>'2018-04-22 00:00:00'
- 如果
sale_mode是数字类型,可以保留数字写法,但建议先通过简单查询验证字段值的格式是否符合预期。
2. 替换IN子句为多个OR条件
部分旧版本的Druid SQL解析器对CASE WHEN中的IN子句支持不够完善,你可以尝试把IN展开成多个OR条件来替代:
SELECT CASE WHEN sale_mode = '1' OR sale_mode = '2' OR sale_mode = '3' THEN 'a' ELSE 'b' END AS type FROM "20051001" WHERE __time>'2018-04-22 00:00:00'
(根据sale_mode的实际类型调整值的格式,数字类型就用=1而非='1')
3. 确认Druid版本兼容性
如果你使用的是0.18之前的旧版Druid,复杂CASE表达式的支持可能存在限制。考虑升级到较新的稳定版本(比如0.20+),新版本对SQL语法的兼容性和覆盖度会更好。
4. 验证基础查询的有效性
先去掉CASE表达式,执行一个简单查询确认数据源和时间范围没问题:
SELECT sale_mode FROM "20051001" WHERE __time>'2018-04-22 00:00:00' LIMIT 10
如果这个查询能正常返回结果,说明数据源和时间过滤逻辑是正常的,问题就集中在CASE表达式的写法上。
内容的提问来源于stack exchange,提问作者Adam Lyu
相关产品推荐
相关产品推荐

