如何在Spanner数据库中用SQL检测列的NULL值(含String、Timestamp类型)
问题根因
Google Cloud Spanner的CASE表达式要求所有返回分支的数据类型必须兼容,你当前的写法中THEN分支返回字符串'A'(STRING类型),如果待检测的列是TIMESTAMP类型,两个分支类型不匹配,就会出现无法正常替换NULL值、始终返回原始列值的问题。
正确实现方式
待检测列为STRING类型
直接使用IFNULL函数即可实现NULL值替换,逻辑比CASE更简洁:
SELECT IFNULL(t.locked_by, 'A') FROM Temp1 t WHERE name='test2'
原有CASE写法本身逻辑没有问题,确认列是STRING类型即可正常运行。
待检测列为TIMESTAMP类型
需要先统一返回值类型,可选两种实现方案:
- 方案1:将时间戳转为STRING类型,统一返回字符串
SELECT IFNULL(CAST(t.locked_by AS STRING), 'A') FROM Temp1 t WHERE name='test2'
- 方案2:使用特殊时间戳作为NULL的标记值,统一返回TIMESTAMP类型
SELECT CASE WHEN t.locked_by IS NULL THEN TIMESTAMP('1970-01-01 00:00:00 UTC') ELSE t.locked_by END FROM Temp1 t WHERE name='test2'
内容的提问来源于stack exchange,提问作者user3702620
相关产品推荐
相关产品推荐

