MySQL: SELECT 不同的正则表达式值

MySQL: SELECT DISTINCT REGEX value

在我的 MySQL 数据库中,我有一个名为 test_column 的行列,其中包含以下行:

dtq test dis
ged something fbd
edf something tds
zhs nothing edk
dda anything zhg
hvf nothing ert
asf nothing vbg

我要查找前三个字符和后三个字符之间的字符串。我可以像这样使用 REGEX 获取这些值:

^\w{3}\s(\w+)\s\w{3}$

我想 SELECT 区分这些值。

预期输出如下:

test
something
nothing
anything

如何使用 MySQL 命令执行此操作?

如果你是运行MySQL8.0,可以使用regexp_replace()如下:

select distinct regexp_replace(col, '(^\w{3}\s)|(\s\w{3}$)', '') new_col from mytable

这是通过用空字符串替换第一个和最后一个单词(以及 following/preceding spaces)来实现的。第一个和最后一个字的长度必须为 3 个字符。

Demo on DB Fiddle:

| new_col   |
| :-------- |
| test      |
| something |
| nothing   |
| anything  |

您可以使正则表达式更通用一些,这样它也可以接受长度不是 3 个字符的起始词和结束词以及超过一个字符的序列 space:

regexp_replace(col, '(^\w+\s+)|(\s+\w{+$)', '')

如果这就足够了,则不需要正则表达式

SUBSTRING_INDEX(col, ' ', 2)

但是,这假定您的“3 个字符”或 \w{3}(实际上是 3 个字母数字字符)并不是真正的测试,而是 space 是关键。

如果这就是您想要的,则不需要正则表达式(删除前 4 个和后 4 个字符):

SELECT DISTINCT SUBSTRING(test_column,5,LENGTH(test_column)-8)
FROM mytable

Demo on dbfiddle.uk

或第一个 space 之后的所有内容,直到第二个 space:

SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(test_column,' ',2),' ',-1)
FROM mytable

Demo on dbfiddle.uk