Sql 隔离在特定字符串之前开始的字符串
我的字符串如下:Sql 隔离在特定字符串之前开始的字符串,sql,regex,snowflake-cloud-data-platform,Sql,Regex,Snowflake Cloud Data Platform,我的字符串如下: 'NAME NAME NAME 400ML NAME CODE' 我需要识别ML,向左走以捕获之前的所有数字,然后在第一个空格处停下来以获取: 400ML 我目前的代码是: SUBSTR(FIELD,CHARINDEX('ML',FIELD), 2) 您可以使用regexp\u substr(): 或对于特定的字母数字字符: select regexp_substr(field, '[a-zA-Z0-9]+ML') 如果雪花不是贪婪的(看起来不太可能,但可能),那么您
'NAME NAME NAME 400ML NAME CODE'
我需要识别ML
,向左走以捕获之前的所有数字,然后在第一个空格处停下来以获取:
400ML
我目前的代码是:
SUBSTR(FIELD,CHARINDEX('ML',FIELD), 2)
您可以使用regexp\u substr()
:
或对于特定的字母数字字符:
select regexp_substr(field, '[a-zA-Z0-9]+ML')
如果雪花不是贪婪的(看起来不太可能,但可能),那么您可以:
select trim(regexp_substr(' ' || field, ' [a-zA-Z0-9]*ML'))
要提取后缀为ML
的数字,请使用
select regexp_substr(field, '[0-9]+ML')
解释
NODE EXPLANATION
--------------------------------------------------------------------------------
[0-9]+ any character of: '0' to '9' (1 or more
times (matching the most amount possible))
--------------------------------------------------------------------------------
ML 'ML'
我建议使用
regexp_substr(field, '\\d+\\s*ML\\b')
这个正则表达式将确保ML
作为一个完整的单词进行匹配,如果数字和ML
之间有任何空格,它们也将被匹配
请参阅
正则表达式详细信息
\d+
-1个或多个数字
\s*
-0个或更多空格
ML
-字符串ML
\b
-单词边界
我注意到WORD-m400ml-code
返回ML
@marcin2x4。通常,正则表达式匹配在默认情况下是贪婪的。我很惊讶《雪花》中的情况并非如此。下面是一个代码工作的示例:。请尝试使用'WORD-ml400mlcode'
:)@marcin2x4。我认为这是在做正确的事情。但是如果您希望至少需要一个字符,那么在第二种方法中使用+
。为什么不只使用regexp\u substr(字段'\\d+ML')
?在ML
之前是否需要匹配任何非数字字符?不,只有数字在ML之前,但在数字之前可能有一个单词中有ML
字符。这样一来,就不会首先找到ML号<代码>名称ML代码MLNAME 400 ML代码
。这可能会有帮助:regexp\u substr(替换(字段),“,”,“\\d+ML”)
如果数字和ML
之间可能有空格,可以将它们与\s*
匹配。另外,什么是ML
是较长单词的一部分?尝试regexp\u substr(字段“\\d+\\s*ML\\b”)
Yes,@WiktorStribiżew-我忘了提到数字和ML之间有空格的情况。您的解决方案非常有效!很好,我发布了一个带有解释和演示的示例。很好的字符类用法示例,尤其是双反斜杠+1。
regexp_substr(field, '\\d+\\s*ML\\b')