如何将变量设置为值数组,以便在 IN 子句中使用?
这有效:
SELECT *
FROM TableA
WHERE Col1 IN ('Value1', 'Value2', 'Value3');
但我不知道如何从手动指定的数组创建一个变量来使用。我想做这样的事情:
SET values = ('Value1', 'Value2', 'Value3');
SELECT *
FROM TableA
WHERE Col1 IN $values;
报错:
SQL compilation error: Number of variables on left-hand side of assignment (1) is not equal to the number of values on right-hand side (3)
那么如何为此目的创建一个数组变量呢?
IN
。前提条件是首先将“列表”变量转换为行。
-- sample table
CREATE OR REPLACE TABLE t AS SELECT $1 AS col FROM VALUES ('a'),('b'),('c'),('d');
案例 1:使用 JSON 和 FLATTEN:
SET lst = '["a","b","e"]';
SELECT value::STRING FROM TABLE(FLATTEN(input=>parse_json($lst)));
/*
a
b
e
*/
SELECT *
FROM t
WHERE col IN (SELECT value::STRING FROM TABLE(FLATTEN(input=>parse_json($lst))));
/*
a
b
*/
情况 2:使用字符串和 SPLIT_TO_TABLE:
SET lst2 = 'a,b,e';
SELECT VALUE FROM TABLE(SPLIT_TO_TABLE($lst2, ','));
/*
a
b
e
*/
SELECT *
FROM t
WHERE col IN (SELECT TRIM(VALUE) FROM TABLE(SPLIT_TO_TABLE($lst2, ',')));
/*
a
b
*/
在这样的用例中,ARRAY_CONTAINS( ) 函数可以成为您的朋友,示例如下:
create or replace temporary table TableA (Col1 varchar(100));
insert into TableA values ('hello'), ('stuff'), ('Value1'), ('Value2'), ('goodbye');
SET search_4me = '["Value1","Value2","Value3"]';
select *
from TableA
where array_contains(Col1::variant, parse_json($search_4me));
^^^ 两行返回 Value1 和 Value2
自 2022 年以来,这已通过雪花脚本中的数组成为可能:
BEGIN
LET values_list := array_construct('Value1', 'Value2', 'Value3');
SELECT *
FROM TableA
WHERE ARRAY_CONTAINS(Col1::VARIANT,:values_list);
END;