将字符串数组转换为 Snowflake 中的数字数组
Posted
技术标签:
【中文标题】将字符串数组转换为 Snowflake 中的数字数组【英文标题】:Convert an array of strings to an array of numbers in Snowflake 【发布时间】:2021-07-30 22:39:38 【问题描述】:如何将字符串值数组转换为数字数组?
背景:
使用 Snowflake,我有一个像“123、45、89”这样的字符串输入,我想将它转换为一个数字数组(123、45、89),以便最终可以与像这样的 int 列进行比较
WHERE id IN ( array of number here)
我想我可以使用SPLIT('123, 45, 89', ',')
来获取一个字符串数组,但是会出现这样的错误:
SQL 编译错误:无法将 [ARRAY] 类型的参数 'SPLIT(?, ',')' 转换为预期类型 [NUMBER(38,0)]
对于上下文,我使用的是 Metabase,并使用文本过滤器作为输入来添加这些 id。
【问题讨论】:
【参考方案1】:您可以尝试利用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',','));
【讨论】:
【参考方案2】:使用STRTOK_SPLIT_TO_TABLE:
使用给定的分隔符集标记字符串,并将结果扁平化为行。
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');
子查询(此时输入可以视为普通表):
SELECT s.value::INT FROM TABLE(STRTOK_SPLIT_TO_TABLE('123,45,89',',')) s;
-- 123
-- 45
-- 89
【讨论】:
以上是关于将字符串数组转换为 Snowflake 中的数字数组的主要内容,如果未能解决你的问题,请参考以下文章
如何将 JSON 字典列表转换为 Snowflake 中的字符串列表?
在我们将其解析为 JSON 之前,Snowflake 如何转义对象数组字符串中的所有特殊字符?