【问题标题】:BigQuery - concatenate ignoring NULLBigQuery - 连接忽略 NULL
【发布时间】:2023-03-03 00:56:01
【问题描述】:

我对 SQL 很陌生。我了解 MySQL 中有 CONCAT_WS 函数,但 BigQuery 无法识别。

我需要将一堆 20 个字段连接成一个逗号分隔的字符串,但有些是 NULL,如果一个是 NULL,那么整个结果将是 NULL。这是我目前所拥有的:

CONCAT(m.track1, ", ", m.track2))) As Tracks,

我试过了,但它也返回 NULL:

CONCAT(m.track1, IFNULL(m.track2,CONCAT(", ", m.track2))) As Tracks,

非常感谢您的任何建议,提前谢谢您。

【问题讨论】:

    标签: sql google-bigquery null concatenation


    【解决方案1】:

    我需要将一堆 20 个字段连接成一个逗号分隔的字符串

    假设这些是表中唯一的字段 - 您可以使用以下方法 - 足够通用以处理任意数量的列及其名称而无需显式枚举

    select  
      (select string_agg(col, ', ' order by offset)
      from unnest(split(trim(format('%t', (select as struct t.*)), '()'), ', ')) col with offset
      where not upper(col) = 'NULL'
      ) as Tracks
    from `project.dataset.table` t
    

    下面是过于简化的虚拟示例,可以尝试,测试方法

    #standardSQL
    with `project.dataset.table` as (
      select 1 track1, 2 track2, 3 track3, 4 track4 union all
      select 5, null, 7, 8
    )
    select  
      (select string_agg(col, ', ' order by offset)
      from unnest(split(trim(format('%t', (select as struct t.*)), '()'), ', ')) col with offset
      where not upper(col) = 'NULL'
      ) as Tracks
    from `project.dataset.table` t    
    

    有输出

    【讨论】:

      【解决方案2】:

      很遗憾,BigQuery 不支持 concat_ws()。所以,一种方法是string_agg()

      select t.*,
             (select string_agg(track, ',')
              from (select t.track1 as track union all select t.track2) x
             ) x
      from t;
      

      其实更简单的方法是使用数组:

      select t.*,
             array_to_string([track1, track2], ',')
      

      结果集中不支持具有NULL 值的数组,但它们可用于中间结果。

      【讨论】:

      • 非常感谢,戈登。我不太遵循 string_agg() 方法,但我会继续努力。数组方法真的很优雅。
      猜你喜欢
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 2011-10-18
      • 2019-12-30
      • 2020-01-20
      相关资源
      最近更新 更多