如何解决在 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',','));
,
使用给定的分隔符集标记一个字符串并将结果展平成行。
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。