【问题标题】:Check if element in list string BigQuery检查列表字符串 BigQuery 中的元素是否
【发布时间】:2019-12-20 22:57:59
【问题描述】:

我在 BigQuery 中有一个逗号分隔的列表

select '1,2,3' as number_list

如果 1 在列表中,我想返回 true 而不拆分为数组然后取消嵌套

我想说

select if(1 in split('1,2,3'),1,0)

我也想避免说

select if('1,2,3' like '%,1,%' or '1,2,3' like '1,%' or '1,2,3' like '%,1',1,0)

【问题讨论】:

    标签: arrays string split google-bigquery


    【解决方案1】:

    以下 BigQuery 标准 SQL 示例

    #standardSQL
    CREATE TEMP FUNCTION InList(list STRING, num INT64) AS ((
      SELECT COUNTIF(num = CAST(number AS INT64)) FROM UNNEST(SPLIT(list)) number
    ));
    WITH `project.dataset.table` AS (
      SELECT '1,2,3' AS number_list UNION ALL
      SELECT '2,3,4'
    )
    SELECT number_list, InList(number_list, 1) in_list
    FROM `project.dataset.table`
    

    结果

    Row number_list in_list  
    1   1,2,3       1    
    2   2,3,4       0      
    

    我也想避免说
    SELECT IF('1,2,3' LIKE '%,1,%' OR '1,2,3' LIKE '1,%' OR '1,2,3' LIKE '%,1',1,0)

    为了避免这种冗余,您可以使用以下版本

    SELECT IF(CONCAT(',', number_list, ',') LIKE CONCAT('%,1,%'), 1, 0)   
    

    ...而且,最后 - 最有可能是赢家 :o)

    我想能够说select if(1 in split('1,2,3'),1,0)

    最接近的是

    SELECT IF('1' IN UNNEST(SPLIT(number_list)), 1, 0)
    

    【讨论】:

      【解决方案2】:

      您可以使用与您的搜索值匹配的 MAX 函数的子查询

      SELECT  id, 
      (SELECT MAX(IF(n = 1, n, null)) = 1 FROM  UNNEST(number_list) AS  n)
      FROM (
      SELECT
      1 AS id,
      [1,2,3] AS number_list
      ) 
      

      或与

      SELECT  id, 
      (SELECT MAX(IF(n = '1', n, null)) = '1' FROM  UNNEST(number_list) AS  n)
      
      FROM (
      SELECT
      1 AS id,
      SPLIT('1,2,3',',') AS number_list
      ) 
      

      【讨论】:

        猜你喜欢
        • 2010-10-04
        • 2017-11-20
        • 2017-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-03
        • 1970-01-01
        • 2014-09-19
        相关资源
        最近更新 更多