You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:47:33