MySQL:使用REGEX来提取string(selectREGEX)

我想有一个像这样的MySQL查询:

select <second word in text> word, count(*) from table group by word; 

在mysql中的所有正则expression式示例用于查询文本是否匹配expression式,但不是从expression式中提取文本。 有这样的语法吗?

下面是针对OP的特定问题(提取string的第二个字)提出的解决scheme,但是应该注意的是,正如mc0e的回答所述,实际上,提取正则expression式匹配并不支持MySQL的开箱即用。 如果你真的需要这个,那么你的select基本上是1)在客户端做后期处理,或者2)安装一个MySQL扩展来支持它。


BenWells几乎是正确的。 从他的代码工作,这是一个稍微调整的版本:

 SUBSTRING( sentence, LOCATE(' ', sentence) + CHAR_LENGTH(' '), LOCATE(' ', sentence, ( LOCATE(' ', sentence) + 1 ) - ( LOCATE(' ', sentence) + CHAR_LENGTH(' ') ) ) 

作为一个工作的例子,我使用了:

 SELECT SUBSTRING( sentence, LOCATE(' ', sentence) + CHAR_LENGTH(' '), LOCATE(' ', sentence, ( LOCATE(' ', sentence) + 1 ) - ( LOCATE(' ', sentence) + CHAR_LENGTH(' ') ) ) as string FROM (SELECT 'THIS IS A TEST' AS sentence) temp 

这成功地提取了单词IS

更短的选项来提取句子中的第二个单词:

 SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('THIS IS A TEST', ' ', 2), ' ', -1) as FoundText 

MySQL文档SUBSTRING_INDEX

根据http://dev.mysql.com/ SUBSTRING函数使用开始位置,然后长度,所以肯定第二个单词的function是:

 SUBSTRING(sentence,LOCATE(' ',sentence),(LOCATE(' ',LOCATE(' ',sentence))-LOCATE(' ',sentence))) 

不,没有使用正则expression式提取文本的语法。 你必须使用普通的string操作函数 。

或者从数据库中select整个值(如果您担心数据传输过多,则select前n个字符),然后在客户端使用正则expression式。

正如其他人所说,mysql不提供提取子string的正则expression式工具。 这并不是说你不能拥有它们,但是如果你准备使用用户定义的函数来扩展mysql的话:

https://github.com/mysqludf/lib_mysqludf_preg

如果你想分发你的软件,这对安装你的软件是一个障碍,但是对于一个内部的解决scheme来说,这可能没有太大的帮助。

我用Brendan Bullen的答案作为一个类似问题的起点,我曾经用JSONstring来检索特定字段的值。 但是,就像我评论他的回答一样,这不完全准确。 如果你的左边界不仅仅是原始问题的空间,那么差异就会增加。

更正的解决scheme:

 SUBSTRING( sentence, LOCATE(' ', sentence) + 1, LOCATE(' ', sentence, (LOCATE(' ', sentence) + 1)) - LOCATE(' ', sentence) - 1 ) 

两个区别是SUBSTRING索引参数中的+1和长度参数中的-1。

对于“在两个提供的边界之间find第一个string”的更一般的解决scheme:

 SUBSTRING( haystack, LOCATE('<leftBoundary>', haystack) + CHAR_LENGTH('<leftBoundary>'), LOCATE( '<rightBoundary>', haystack, LOCATE('<leftBoundary>', haystack) + CHAR_LENGTH('<leftBoundary>') ) - (LOCATE('<leftBoundary>', haystack) + CHAR_LENGTH('<leftBoundary>')) ) 

我不认为这样的事情是可能的。 你可以使用substring函数来提取你想要的部分。

该字段的值是:

  "- DE-HEB 20% - DTopTen 1.2%" SELECT .... SUBSTRING_INDEX(SUBSTRING_INDEX(DesctosAplicados, 'DE-HEB ', -1), '-', 1) DE-HEB , SUBSTRING_INDEX(SUBSTRING_INDEX(DesctosAplicados, 'DTopTen ', -1), '-', 1) DTopTen , FROM TABLA 

结果是:

  DE-HEB DTopTEn 20% 1.2%