Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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_Snowflake Cloud Data Platform - Fatal编程技术网

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')