Tengo una lista separada por comas en BigQuery

select '1,2,3' as number_list

Quiero devolver verdadero si 1 está en la lista sin dividirlo en una matriz y luego desagradable

Quiero poder decir

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

También quiero evitar decir

select if('1,2,3' like '%,1,%' or '1,2,3' like '1,%' or '1,2,3' like '%,1',1,0)
1
user147529 21 dic. 2019 a las 01:57

2 respuestas

La mejor respuesta

Ejemplo a continuación para BigQuery Standard 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`

Con resultado

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

También quiero evitar decir
SELECT IF('1,2,3' LIKE '%,1,%' OR '1,2,3' LIKE '1,%' OR '1,2,3' LIKE '%,1',1,0)

Para evitar dicha redundancia puede usar la versión siguiente

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

... Y, finalmente, y muy probablemente el ganador: de)

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

La mas cercana es

SELECT IF('1' IN UNNEST(SPLIT(number_list)), 1, 0)
2
Mikhail Berlyant 21 dic. 2019 a las 00:02

Puede usar la subconsulta con la función MAX que coincida con su valor buscado

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
) 

O con

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
) 
0
Adrian 20 dic. 2019 a las 23:15