将字符串数组转换为 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 如何转义对象数组字符串中的所有特殊字符?

c语言中假设一个数组中已经存放若干个数字字符,编写程序,将每个数字字符转换成对应的数字后存放在另一个

将每个数字从保存在字符串中的数字转换为 int 数组