【问题标题】:BigQuery - Convert Array of dates into stringBigQuery - 将日期数组转换为字符串
【发布时间】:2018-04-13 17:57:41
【问题描述】:

我在Big Query 中有一个表,其中一些字段是日期数组(类型为 Date Repeated)。我需要将它们转换为字符串。对于字符串字段数组,我按如下方式进行操作,并且效果很好:

ARRAY_TO_STRING(national_id, "|", "") AS national_id

但是当字段是日期数组时,我会遇到错误。

对于参数类型:ARRAY、STRING、STRING 的函数 ARRAY_TO_STRING 没有匹配的签名。支持的签名: ARRAY_TO_STRING(数组,字符串,[字符串]); ARRAY_TO_STRING(ARRAY, BYTES, [BYTES]) 在 [41:1]

我还尝试将日期转换为字符串,如下所示:

ARRAY_TO_STRING(cast(natural_person_date_of_birth_list as string), "|", "") AS natural_person_date_of_birth_list,

但我遇到以下错误:

在 [41:22] 从 ARRAY 到 STRING 的强制转换无效。

谁能帮我解决这个问题?

非常感谢

【问题讨论】:

    标签: sql arrays google-bigquery


    【解决方案1】:

    您可以在选择列表中使用子查询将日期转换为字符串。例如,

    SELECT
      ARRAY_TO_STRING(national_id, "|", "") AS national_id,
      (SELECT STRING_AGG(date, "|") FROM UNNEST(natural_person_date_of_birth_list)) AS dates_of_birth
    FROM YourTable;
    

    这种方法的优点是您可以为每一行获取一个字符串,这听起来像是您想要的。

    【讨论】:

      【解决方案2】:

      请参阅下面的两个选项。两者都适用于 BigQuery 标准 SQL

      #standardSQL
      SELECT 
        REPLACE(REGEXP_REPLACE(TO_JSON_STRING(natural_person_date_of_birth_list), r'\[|\]|"', ''), ',', '|') dates_string_1,
        (SELECT STRING_AGG(FORMAT_DATE('%Y-%m-%d', d), "|") 
          FROM UNNEST(natural_person_date_of_birth_list) d) AS dates_string_2
      FROM `project.dataset.table`  
      

      以下内容仅供您快速测试和使用:

      #standardSQL
      WITH `project.dataset.table` AS (
        SELECT [CURRENT_DATE(), DATE '2011-10-15'] natural_person_date_of_birth_list
      )
      SELECT 
        REPLACE(REGEXP_REPLACE(TO_JSON_STRING(natural_person_date_of_birth_list), r'\[|\]|"', ''), ',', '|') dates_string_1,
        (SELECT STRING_AGG(FORMAT_DATE('%Y-%m-%d', d), "|") 
          FROM UNNEST(natural_person_date_of_birth_list) d) AS dates_string_2
      FROM `project.dataset.table`  
      

      两个选项都返回我认为预期的结果:

      dates_string_1           dates_string_2  
      2017-11-01|2011-10-15    2017-11-01|2011-10-15    
      

      注意:第二个选项的好处是您可以控制列表中日期的顺序,例如

      #standardSQL
      WITH `project.dataset.table` AS (
        SELECT [CURRENT_DATE(), DATE '2011-10-15'] natural_person_date_of_birth_list
      )
      SELECT 
        REPLACE(REGEXP_REPLACE(TO_JSON_STRING(natural_person_date_of_birth_list), r'\[|\]|"', ''), ',', '|') dates_string_1,
        (SELECT STRING_AGG(FORMAT_DATE('%Y-%m-%d', d), "|" ORDER BY d) 
          FROM UNNEST(natural_person_date_of_birth_list) d
        ) AS dates_string_2
      FROM `project.dataset.table`  
      

      这里的输出将是(注意 dates_string_2 的变化)

      dates_string_1          dates_string_2   
      2017-11-01|2011-10-15   2011-10-15|2017-11-01    
      

      【讨论】:

        【解决方案3】:

        您可以使用unnest()

        select string_agg(cast(dte as string), '|')
        FROM (select [date('2017-01-01'), date('2018-01-01')] as aofd
             ) d,
             unnest(aofd) as dte
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-17
          • 1970-01-01
          • 2021-06-02
          • 1970-01-01
          • 2017-09-19
          • 1970-01-01
          • 1970-01-01
          • 2020-06-27
          相关资源
          最近更新 更多