将字符串数组转换为 Snowflake 中的数字数组

Convert an array of strings to an array of numbers in Snowflake

如何将字符串值数组转换为数字数组?

背景:

使用 Snowflake,我有一个字符串输入,如“123、45、89”,我想将其转换为数字数组 (123、45、89),以便我最终可以与 int 列进行比较,如

WHERE id IN ( array of number here)

我想我可以使用 SPLIT('123, 45, 89', ',') 来获取字符串数组,但是得到这样的错误:

SQL compilation error: Can not convert parameter 'SPLIT(?, ',')' of type [ARRAY] into expected type [NUMBER(38,0)]

对于上下文,我使用元数据库,将文本过滤器作为输入来添加这些 ID。

您可以尝试利用 ARRAY_CONTAINS 函数,而不是 WHERE IN 选项。棘手的部分是 SPLIT 函数创建一个字符串数组,而不是数字,因此您必须首先将 id 字段转换为字符串。您还需要注意初始字符串中的空格,因为这也会产生问题。然而,这样的事情是有效的:

  CREATE OR REPLACE TEMP TABLE testing (id int);
  INSERT INTO testing (id) VALUES (45);

然后在使用 string/array 查询此 table 时:

  SELECT t.id
  FROM testing t
  WHERE array_contains(t.id::varchar::variant,SPLIT('123,45,89',','));

使用STRTOK_SPLIT_TO_TABLE:

Tokenizes a string with the given set of delimiters and flattens the results into rows.

SELECT * 
FROM t
WHERE id IN (SELECT s.value::INT 
             FROM TABLE(STRTOK_SPLIT_TO_TABLE('123,45,89',',')) s
             );

或者使用相同的模式但作为 JOIN:

SELECT t.*
FROM t
JOIN TABLE(STRTOK_SPLIT_TO_TABLE('123,45,89',',')) s ON t.id = s.value::INT;

它是如何工作的:

数据准备:

CREATE OR REPLACE TABLE t(id INT, col TEXT);
INSERT INTO t(id, col) VALUES (1, 'a'), (2,'b'), (45, 'c');

子查询(此时输入可以当作普通的table):

SELECT s.value::INT FROM TABLE(STRTOK_SPLIT_TO_TABLE('123,45,89',',')) s;
-- 123
-- 45
-- 89