雪花 - 检查模式并返回该模式中的子字符串
Posted
技术标签:
【中文标题】雪花 - 检查模式并返回该模式中的子字符串【英文标题】:Snowflake - checking for pattern and returning substring within that pattern 【发布时间】:2021-07-26 19:10:07 【问题描述】:我有一个包含多个列的表,我必须查看这些列以检查该值:'[m='
并返回该列表中的数字。
例如,假设我在“名称”列中有这个 xyzzy [m=123]
我想返回 123
。
我正在尝试以下查询,但它不起作用,因为我一直看到以下错误:
SQL 编译错误:位置 4 处的第 3 行语法错误意外 '什么时候'。第 3 行出现语法错误,位置 34 意外')'。
我还认为 SPLIT_PART 不起作用,因为如果我有 xyzzy [m=123] 它将返回 123] 并且我不希望包含右括号
case
WHEN REGEXP_SUBSTR(name, '[m=') THEN SPLIT_PART(name, '[m=', )
WHEN REGEXP_SUBSTR(name2, '[m=') THEN SPLIT_PART(name2, '[m=', )
WHEN REGEXP_SUBSTR(name3, '[m=') THEN SPLIT_PART(name3, '[m=', )
WHEN REGEXP_SUBSTR(name4, '[m=') THEN SPLIT_PART(name4, '[m=', )
WHEN REGEXP_SUBSTR(name5, '[m=') THEN SPLIT_PART(name5, '[m=', )
WHEN REGEXP_SUBSTR(name6, '[m=') THEN SPLIT_PART(name6, '[m=', )
else null;
+------+--------+---------+------------+------+----------------+---------------+
| name | name2 | name3 | name3 | name5 | name6 |
+------+--------+---------+------------+------+----------------+---------------+
| xyzzy [m=123] | MyISAM | 10 | Fixed | 0 | my comment |
+------+--------+---------+------------+------+----------------+---------------+
| rts3 | MyISAM | 1 | test [m=122] | 4 | my comment |
+------+--------+---------+------------+------+----------------+---------------+
| rddts3 | MyISAM | 1 | dm32dfe | 4 | comment [m=177] |
+------+--------+---------+------------+------+----------------+---------------+
*** 编辑:我尝试将查询调整为如下所示:
Select *,
CASE
WHEN REGEXP_SUBSTR(NAME, '(?:\[m=)') THEN REGEXP_SUBSTR(NAME, '[[]m=([0-9]+)'),
WHEN REGEXP_SUBSTR(NAME2, '(?:\[m=)') THEN REGEXP_SUBSTR(NAME2, '[[]m=([0-9]+)'),
ELSE null
END
from my_table
但现在我看到了这个错误: SQL 编译错误:位置 0 处的错误行 2 函数“IFF”的参数类型无效:(VARCHAR(16777216), VARCHAR(16777216), NULL)
【问题讨论】:
【参考方案1】:您可以将regexp_substr()
与捕获组一起使用:
REGEXP_SUBSTR(name, '[[]m=([0-9]+)', 1, 0, 'e')
我不确定您的 case
表达式的用途。如果你想要一堆名字中的第一个匹配,你可以使用:
COALESCE(REGEXP_SUBSTR(name, '[[]m=([0-9]+)', 1, 0, 'e'),
REGEXP_SUBSTR(name2, '[[]m=([0-9]+)', 1, 0, 'e'),
. . .
)
【讨论】:
感谢您的回复! @Gordon Linoff 我根据您提到的内容进行了尝试:选择 *,case WHEN REGEXP_SUBSTR(NAME, '(?:[m=)') THEN REGEXP_SUBSTR(NAME, '[[]m=([0-9]+) ') else null end from my_table;但我看到我在问题中提到的错误,我已添加为“编辑” @KristiLuna 。 . .运行没有case
的代码。此答案中没有case
表达式。以上是关于雪花 - 检查模式并返回该模式中的子字符串的主要内容,如果未能解决你的问题,请参考以下文章
CUDA、Boost 和 Cmake “字符串子命令 REGEX,模式 MATCHALL 需要至少 5 个参数来命令。”