检查列表字符串 BigQuery 中的元素是不是

Posted

技术标签:

【中文标题】检查列表字符串 BigQuery 中的元素是不是【英文标题】: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)

【问题讨论】:

【参考方案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
) 

【讨论】:

以上是关于检查列表字符串 BigQuery 中的元素是不是的主要内容,如果未能解决你的问题,请参考以下文章

如何检查列表列表中的所有元素是不是都是字符串

如何检查字符串是不是包含列表的任何元素并获取元素的值?

python如何检查字符串是不是是字符串列表的元素[重复]

如何检查 Bigquery 中两个字符串共有多少个单词?

检查一个列表元素中的元素是不是存在于另一个列表中

检查一个列表是不是包含另一个列表中的元素