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

Dav*_*lli 5 snowflake-cloud-data-platform

如何将变量设置为值数组,以便在 IN 子句中使用?

这有效:

SELECT *
  FROM TableA
 WHERE Col1 IN ('Value1', 'Value2', 'Value3');
Run Code Online (Sandbox Code Playgroud)

但我不知道如何从手动指定的数组创建要使用的变量。我想做这样的事情:

SET values = ('Value1', 'Value2', 'Value3');

SELECT *
  FROM TableA
 WHERE Col1 IN $values;
Run Code Online (Sandbox Code Playgroud)

报告的错误: 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)

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

Luk*_*zda 6

IN可用于。前提条件是首先将“列表”变量转换为行。

-- sample table
CREATE OR REPLACE TABLE t AS SELECT $1 AS col FROM VALUES ('a'),('b'),('c'),('d');
Run Code Online (Sandbox Code Playgroud)

案例 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
*/
Run Code Online (Sandbox Code Playgroud)

情况 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
*/
Run Code Online (Sandbox Code Playgroud)


Ric*_*ane 0

在这样的用例中,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));
Run Code Online (Sandbox Code Playgroud)

^^^ 两行返回 Value1 和 Value2