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

问题描述

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

背景:

使用 SNowflake,我有一个像“123,45,89”这样的字符串输入,我想将它转换为一个数字数组 (123,89),以便我最终可以与像这样的 int 列进行比较

WHERE id IN ( array of number here)

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

sql 编译错误:无法将类型 [ARRAY] 的参数 'SPLIT(?,')' 转换为预期类型 [NUMBER(38,0)]

对于上下文,我使用 Metabase,并使用文本过滤器作为输入来添加这些 id。

解决方法

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

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

然后当用你的字符串/数组查询这个表时:

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

使用 STRTOK_SPLIT_TO_TABLE

使用给定的分隔符集标记一个字符串并将结果展平成行。

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

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

SELECT t.*
FROM t
JOIN TABLE(STRTOK_SPLIT_TO_TABLE('123,')) 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');

子查询(此时可以将输入视为普通表):

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