如何在 MySQL 中使用 REGEXP 使用 SUBSTRING

Mar*_*jak 16 mysql regular-expression

我有以下情况。我必须使用 MySQL 从描述中子字符串正则表达式。描述:

Lorem D9801 ipsum dolor 坐 amet

其中 D9801 是 REGEXP。每个强文本描述都有不同的内容,但我的正则表达式应该如下所示:REGEXP 'D[[:digit:]]{4}'

REGEXP 总是以“D”开头和“xxxx” - 4 位数字结尾:Dxxxx

我知道 REGEXP 只返回 true/false 值,但如何查询只返回“D9801”值?

我试过这样的事情:

SELECT SUBSTRING (description, LOCATE(REGEXP 'D[[:digit:]]{4}', description), 5)
FROM (
   SELECT "Lorem D9801 ipsum dolor sit amet" AS description
) temp
Run Code Online (Sandbox Code Playgroud)

我知道这是错误的,所以我尝试这样做:

SELECT 
    id, 
    SUM(description REGEXP 'D[[:digit:]]{4}') AS matches, 
    CASE
        WHEN (SUM(description REGEXP 'D[[:digit:]]{4}') > 0) THEN 
            SUBSTRING(description, LOCATE( /*POSITION_OF_REGEXP_IN_DESC*/ , description), 5)
        ELSE 'Brak schematu'
    END AS show_substr FROM ps_description GROUP BY id;
Run Code Online (Sandbox Code Playgroud)

但是如何找到正则表达式的位置?

我听说过 UDF 但我不能使用它,我使用 OVH 托管。

Jam*_*oat 4

这需要使用LOCATEandSUBSTRING语法从字符串中获取信息。这里解释了您需要的基本定位语法。

LOCATE(搜索str,str,[位置])

search str = 将要搜索的字符串。

str=要搜索的字符串。

位置(可选)= 搜索开始位置(在第二个参数内)。

虽然解释了您需要的子字符串函数虽然此处

子字符串(str、pos、len)

str= 一个字符串。

pos= 起始位置。

len= 字符长度。

查看此问题的更简单方法是将子字符串视为以下 SUBSTRING(str FROM pos FOR len)

我用来获取第二个单词的语法如下,我利用了您尝试提取的第二个单词周围不断出现的空格。

declare @String varchar(50) ='Lorem D9801 ipsum dolor sit amet'

SUBSTRING
(
@String,
LOCATE(' ', @String),
LOCATE(' ', @String, (LOCATE(' ', @String) + 1)) - LOCATE(' ', @String)
)
Run Code Online (Sandbox Code Playgroud)