Snowflake SQL - 如何使用数组变量查询 IN 子句

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

如何将变量设置为值数组,以便在 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)

那么如何为此目的创建一个数组变量呢?

snowflake-cloud-data-platform
3个回答
6
投票
可以使用

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
*/

1
投票

在这样的用例中,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


0
投票

自 2022 年以来,这已通过雪花脚本中的数组成为可能:

BEGIN
LET values_list := array_construct('Value1', 'Value2', 'Value3');

SELECT *
FROM TableA
WHERE ARRAY_CONTAINS(Col1::VARIANT,:values_list);
END;

© www.soinside.com 2019 - 2024. All rights reserved.