将字符串数组转换为 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',','));
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
如何将字符串值数组转换为数字数组?
背景:
使用 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',','));
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