我正在尝试构造一个案例,当BQ中的时间戳列上的语句称为version_end_ts。具体来说,我希望我的声明为:
当version_end_ts ='null'然后'active'否则'past'作为状态结束
问题是BQ告诉我它“无法将文字“ null”转换为TIMESTAMP”。如果没有时间戳,是否可以返回正标记?我搜寻了高低,找不到答案。
预先感谢您的帮助。
布莱恩
答案 0 :(得分:1)
我找不到与您的问题完全相同的副本,至少找不到BigQuery。在BigQuery(以及大多数SQL形式)中,NULL
是一个特殊值,使用特殊操作符NULL
和IS NULL
检查IS NOT NULL
值是否存在。 。因此,您的CASE
表达式应如下所示:
CASE WHEN version_end_ts IS NULL THEN 'active' ELSE 'past' END AS status
我们之所以需要使用IS NULL
而不是=
的原因是,NULL
根据定义代表了一个未知的值。因此,用=
运算符来比较未知的东西是没有意义的,因为那永远不会是真的。
答案 1 :(得分:1)
以下是另一种选择(BigQuery Standard SQL)
main()
这是首选项的问题-我通常更喜欢不太冗长的选项
您可以使用以下虚拟数据进行检查
IF(version_end_ts IS NULL, 'active', 'past') AS status
结果为
#standardSQL
WITH `project.dataset.table` AS (
SELECT NULL AS version_end_ts UNION ALL
SELECT CURRENT_TIMESTAMP()
)
SELECT
version_end_ts,
IF(version_end_ts IS NULL, 'active', 'past') AS status
FROM `project.dataset.table`