大查询if和日期错误

时间:2018-02-27 11:45:09

标签: sql google-cloud-platform google-bigquery

我正在创建一个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必须对一个共同的超类型具有强制性。

由于

2 个答案:

答案 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
  )