Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在字符之前获取所有数字?_Sql_Regex_Vertica - Fatal编程技术网

Sql 如何在字符之前获取所有数字?

Sql 如何在字符之前获取所有数字?,sql,regex,vertica,Sql,Regex,Vertica,我需要获取base中满足下一个逻辑的所有行: [some text/][digits(one or more)]_[some text] 比如说, 'Main/Search/124_mobile' 'Main/Search/4_service' 首先,我需要得到这些行,然后得到\uu符号前面的数字 我尝试了这种类型的正则表达式: regexp_like(event, '^[Main/Search/[1-9]+(?=_') 但它只提取如下行: Main/Search/1_ 并且不提取在符号

我需要获取base中满足下一个逻辑的所有行:

[some text/][digits(one or more)]_[some text]
比如说,

'Main/Search/124_mobile'
'Main/Search/4_service'
首先,我需要得到这些行,然后得到
\uu
符号前面的数字

我尝试了这种类型的正则表达式:

regexp_like(event, '^[Main/Search/[1-9]+(?=_')
但它只提取如下行:

Main/Search/1_
并且不提取在
符号前面有许多数字的行


最后,我希望在
符号之前得到数字。对于值
'Main/Search/124\u mobile'
它将是
'124'

您要查找的是这个

选择REGEXP\u REPLACE(事件'.*\/(\d+)\\\.*','\1')
首先,我发现使用Vertica正则表达式函数时,最好使用
\d
(数字的缩写)而不是
\[0-9]
进行数字匹配

模式
*\/(\d+)\.*
匹配
事件的整个值,但由于
\d+
包含在括号中,因此它成为第一个捕获的组,在替换参数中表示为反斜杠1
\1
,因此即使
事件中的整个值匹配,仅显示第一组
\1

要进行筛选,以便查询结果中只显示包含该模式的行,请使用
REGEXP\u LIKE

整个查询将如下所示

选择REGEXP\u REPLACE(事件'.*\/(\d+)\\\.*','\1')
从桌子上
其中REGEXP_类似(事件'.*\/\d+\\\.*');

有关更多信息,请参阅本页文档中最后一个示例(底部关于电话号码的示例):

您要查找的就是这个

选择REGEXP\u REPLACE(事件'.*\/(\d+)\\\.*','\1')
首先,我发现使用Vertica正则表达式函数时,最好使用
\d
(数字的缩写)而不是
\[0-9]
进行数字匹配

模式
*\/(\d+)\.*
匹配
事件的整个值,但由于
\d+
包含在括号中,因此它成为第一个捕获的组,在替换参数中表示为反斜杠1
\1
,因此即使
事件中的整个值匹配,仅显示第一组
\1

要进行筛选,以便查询结果中只显示包含该模式的行,请使用
REGEXP\u LIKE

整个查询将如下所示

选择REGEXP\u REPLACE(事件'.*\/(\d+)\\\.*','\1')
从桌子上
其中REGEXP_类似(事件'.*\/\d+\\\.*');

有关更多信息,请参阅本页文档中的最后一个示例(底部关于电话号码的示例):

您使用的是哪种DBMS?@FDavidov VerticaDidn我不愿意熟悉它。很抱歉我唯一能告诉您的是,如果您要执行一个select,其中
WHERE
包含正则表达式,您可能需要等待很长时间才能得到结果(这里我假设您的表可能相当大)。我建议您首先获取匹配记录的子集(例如,在特定字段中包含一个或多个数字的记录),然后使用正则表达式执行第二次扫描。@FDavidov谢谢您的建议!也许你能帮我学习正则表达式?我认为从DBMS到DBMS没有太大的变化。您是否总是有两个
/
来分隔元素?您使用的是哪种DBMS?@FDavidov Verticadidd不愿意熟悉它。很抱歉我唯一能告诉您的是,如果您要执行一个select,其中
WHERE
包含正则表达式,您可能需要等待很长时间才能得到结果(这里我假设您的表可能相当大)。我建议您首先获取匹配记录的子集(例如,在特定字段中包含一个或多个数字的记录),然后使用正则表达式执行第二次扫描。@FDavidov谢谢您的建议!也许你能帮我学习正则表达式?我认为从DBMS到DBMS没有太大的变化。您是否总是有两个
/
来分隔元素?