我正在创建一个if函数来检查字符串日期是否与当前年份匹配。我的下一步是做一个约会或只是显示常规日期。
在BQ中尝试此IF功能时出现以下错误。
查询字符串出错:参数类型的函数IF没有匹配的签名:BOOL,DATE,BOOL。支持的签名:IF(BOOL,ANY,ANY)在[3:1]
IF(FORMAT_DATETIME("%Y",CURRENT_DATETIME())= SUBSTR(date, 0, 4),
DATE(cast(SUBSTR(date, 0, 4) AS INT64),cast(SUBSTR(date, 4, 2) AS INT64),cast(SUBSTR(date, 6, 2) AS INT64)),
FALSE)
以下工作:
IF(FORMAT_DATETIME("%Y",CURRENT_DATETIME())= SUBSTR(date, 0, 4),
TRUE,
FALSE)
如何在BQ(标准sql)中使用它?
文档说这是我不明白的,并且在google上找不到明确的答案。 https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#conditional-expressions
true_result和else_result必须对一个共同的超类型具有强制性。
由于
答案 0 :(得分:1)
我想你只想要case
:
(CASE WHEN FORMAT_DATETIME('%Y', CURRENT_DATETIME()) =
SUBSTR(date, 0, 4),
THEN DATE(cast(SUBSTR(date, 0, 4) AS INT64), cast(SUBSTR(date, 4, 2) AS INT64),cast(SUBSTR(date, 6, 2) AS INT64))
END)
我认为你可以简化一下。例如:
(CASE WHEN FORMAT_DATETIME('%Y', CURRENT_DATETIME()) = SUBSTR(date, 1, 4),
THEN PARSE_DATE('%Y%m%d', date)
END)
答案 1 :(得分:1)
我认为Google SQL拒绝混合DATE类型和BOOLEAN的返回值!
在您的示例中,IF的第三个参数(BOOL,ANY,ANY)等于FALSE 但它必须是DATE类型或必须为NULL。
IF(FORMAT_DATETIME("%Y",CURRENT_DATETIME())= SUBSTR(date, 0, 4)
,DATE(cast(SUBSTR(date, 0, 4) AS INT64)
,cast(SUBSTR(date, 4, 2) AS INT64)
,cast(SUBSTR(date, 6, 2) AS INT64)
)
,NULL
)