雪花 - 检查模式并返回该模式中的子字符串

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 表达式。

以上是关于雪花 - 检查模式并返回该模式中的子字符串的主要内容,如果未能解决你的问题,请参考以下文章

PB中取字符串子串的函数是啥

如何删除遵循模式的子字符串

CUDA、Boost 和 Cmake “字符串子命令 REGEX,模式 MATCHALL 需要至少 5 个参数来命令。”

检查字符串是不是包含模式,忽略位置。并返回项目匹配的索引

(王道408考研数据结构)第四章串-第二节:串的模式匹配算法(朴素和KMP)

[在python中使用正则表达式搜索字符串子字符串