Crate DB 2.1.6版本中Timestamp字段用WHERE IN触发空指针异常求助
关于Crate DB 2.1.6中WHERE IN查询timestamp列触发NPE的问题
首先给你明确结论:WHERE IN 语法本身完全支持 timestamp 类型列,你碰到的这个NullPointerException绝对不是语法兼容问题,而是Crate DB 2.1.6这个老旧版本的已知bug——这个版本发布于2018年左右,在处理包含重复值的IN列表(比如你查询里1519705800000出现了两次)与timestamp列匹配时,存在未处理的空指针场景。
下面给你几个可行的解决思路:
1. 移除IN列表中的重复值
既然重复值可能触发bug,最简单的办法就是删掉重复的时间戳,修改后的查询语句如下:
SELECT * FROM "myschema"."timetable" WHERE "start_time" IN (1519705800000, 1519710840000, 1519718400000)
这个操作应该能直接绕过当前版本的bug。
2. 显式转换时间戳类型
你传入的是毫秒级数值,虽然Crate DB能自动转换为timestamp,但显式转换可以避免类型转换过程中的潜在异常,两种写法供你参考:
- 直接使用时间戳字符串:
SELECT * FROM "myschema"."timetable" WHERE "start_time" IN ( TIMESTAMP '2018-02-27T09:30:00Z', TIMESTAMP '2018-02-27T10:54:00Z', TIMESTAMP '2018-02-27T13:00:00Z' )
- 使用
TO_TIMESTAMP函数转换数值:
SELECT * FROM "myschema"."timetable" WHERE "start_time" IN ( TO_TIMESTAMP(1519705800000), TO_TIMESTAMP(1519710840000), TO_TIMESTAMP(1519718400000) )
3. 升级到更高版本的Crate DB
这是最彻底的解决办法——2.1.6版本过于老旧,后续的3.x及以上稳定版本已经修复了大量这类底层bug,不仅能解决这个空指针问题,还能获得更好的性能、稳定性和新功能支持。如果条件允许,强烈建议升级。
4. 用JOIN子查询替代IN逻辑
如果上面的方法暂时无法实施,还可以用JOIN子查询实现相同的筛选效果:
SELECT t.* FROM "myschema"."timetable" t JOIN ( SELECT TO_TIMESTAMP(1519705800000) AS ts UNION ALL SELECT TO_TIMESTAMP(1519710840000) AS ts UNION ALL SELECT TO_TIMESTAMP(1519718400000) AS ts ) s ON t."start_time" = s.ts
内容的提问来源于stack exchange,提问作者Alex J Gr
相关产品推荐
相关产品推荐

