在雪花中,你可以从变量传递类似任何列表吗

问题描述 投票:0回答:1

当我在一个变量中有一系列值时,您可以使用如下方式将它们传递给 where 子句:

SET LIST = '["LIST1","LIST2"]';

SELECT * FROM TABLE WHERE FILTER IN (SELECT VALUE FROM TABLE(FLATTEN(INPUT => PARSE_JSON($LIST))))

我想使用 ILIKE ANY 做同样的事情,但它只允许您从选择中返回一行

SET LIST = '["%LIST1%","%LIST2%"]';
SELECT * FROM TABLE WHERE FILTER ILIKE ANY (SELECT VALUE FROM TABLE(FLATTEN(INPUT => PARSE_JSON($LIST))))

错误:单行子查询返回多于一行。

所以我需要某种方法来进一步展平列表,但仍允许将其传递给 ILIKE ANY() 函数。

最终结果如下所示,但使用变量 $LIST

SELECT * FROM TABLE WHERE FILTER ILIKE ANY('%LIST1%','%LIST2%')
sql snowflake-cloud-data-platform
1个回答
0
投票

您正在寻找 ARRAY_CONTAINS,第一个值是单个查找的值,它需要是 VARIANT 类型,因此下面的转换,第二个是 VARIANT ARRAY,它是 PARSE_JSON 为我们生成的。

SET LIST = '["LIST1","LIST2"]';


with example_data as (
    select * from values
    (1,'LIST1'),
    (2,'LIST2'),
    (3,'LIST3')
)
SELECT * 
FROM example_data as d
WHERE array_contains(d.column2::variant, PARSE_JSON($LIST));
第一栏 第2栏
1 列表1
2 列表2
© www.soinside.com 2019 - 2024. All rights reserved.