Snowflake 中 MySQL 函数 find_in_set 的等价物是什么?
What is the equivalent for the MySQL function find_in_set in Snowflake?
我正在尝试将一些 MySQL 转换为 Snowflake SQL,但我无法在 Snowflake 中获得相同的结果。我认为问题出在 find_in_set。我发现 contains 是一个类似的功能,但它似乎不起作用
有人知道 Snowflake 中 find_in_set 的合适替代品吗?
以下是我发现的 contains 和 find_in_set 之间的区别:
包含:Returns 如果 expr1 包含 expr2,则为真。两个表达式都必须是文本或二进制表达式。
find_in_set:FIND_IN_SET() 函数 returns 字符串在字符串列表中的位置。
也许您正在寻找 POSITION 函数,这里是它的文档。
https://docs.snowflake.com/en/sql-reference/functions/position.html
它声明它“搜索第二个参数中第一个参数的第一次出现,如果成功,returns 第二个参数中第一个参数的位置(从 1 开始)。”
这听起来正是您所需要的。
MySQL FIND_IN_SET 似乎正在处理一个 strlist,它看起来是一个字符串数组。
因此在示例中:
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
-> 2
所以不是子串b
的字符串位置,而是数组位置
所以使用 ARRAY_CONSTRUCT 只是为了制作数组,使用 ARRAY_POSITION 来找到基于零的偏移量(mysql 是 1 个偏移量,0 表示不存在)和 Snowflake returns NULL 未预设
SELECT array_construct('a','b','c','d') as strlist
,array_position('a'::variant, strlist) as a_pos
,array_position('b'::variant, strlist) as b_pos
,array_position('k'::variant, strlist) as k_pos;
给出:
STRLIST
A_POS
B_POS
K_POS
[ "a", "b", "c", "d" ]
0
1
null
如果您的字符串列表是单个字符串,您也可以使用 SPLIT:
split('a,b,c,d',',') as strlist
我正在尝试将一些 MySQL 转换为 Snowflake SQL,但我无法在 Snowflake 中获得相同的结果。我认为问题出在 find_in_set。我发现 contains 是一个类似的功能,但它似乎不起作用
有人知道 Snowflake 中 find_in_set 的合适替代品吗?
以下是我发现的 contains 和 find_in_set 之间的区别:
包含:Returns 如果 expr1 包含 expr2,则为真。两个表达式都必须是文本或二进制表达式。
find_in_set:FIND_IN_SET() 函数 returns 字符串在字符串列表中的位置。
也许您正在寻找 POSITION 函数,这里是它的文档。 https://docs.snowflake.com/en/sql-reference/functions/position.html
它声明它“搜索第二个参数中第一个参数的第一次出现,如果成功,returns 第二个参数中第一个参数的位置(从 1 开始)。”
这听起来正是您所需要的。
MySQL FIND_IN_SET 似乎正在处理一个 strlist,它看起来是一个字符串数组。
因此在示例中:
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
-> 2
所以不是子串b
的字符串位置,而是数组位置
所以使用 ARRAY_CONSTRUCT 只是为了制作数组,使用 ARRAY_POSITION 来找到基于零的偏移量(mysql 是 1 个偏移量,0 表示不存在)和 Snowflake returns NULL 未预设
SELECT array_construct('a','b','c','d') as strlist
,array_position('a'::variant, strlist) as a_pos
,array_position('b'::variant, strlist) as b_pos
,array_position('k'::variant, strlist) as k_pos;
给出:
STRLIST | A_POS | B_POS | K_POS |
---|---|---|---|
[ "a", "b", "c", "d" ] | 0 | 1 | null |
如果您的字符串列表是单个字符串,您也可以使用 SPLIT:
split('a,b,c,d',',') as strlist