在mysql中模拟正则表达式捕获组

Ale*_*x Q 5 regex mysql

据我所知,MySQL不支持从正则表达式匹配中检索捕获组的值.我找到了一个服务器端扩展(lib_mysqludf_preg),它将添加此功能,但我无法在我的环境中安装此扩展.

所以,我正在寻找一种方法来模拟捕获正则表达式匹配的一部分作为SQL查询中的列.

我的数据如下所示(我无法更改服务器上的数据格式):

+-----------------------------+
| Version                     |
+-----------------------------+
| 1.2.3.4                     |
| 10.20.30.40                 |
| Obsidian-1.2.3.4            |
| Obsidian-11.21.31.41        |
| custom\Obsidian-11.21.31.41 |
| custom\11.21.31.41          |
+-----------------------------+
Run Code Online (Sandbox Code Playgroud)

我想要捕获每行的最后4位数字.数字始终是值的最后一部分,它们始终用点分隔.以下正则表达式将匹配我想要的所有值:

.*[[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+$
Run Code Online (Sandbox Code Playgroud)

我希望的结果是将每个数字作为一列捕获的函数组合,以便我可以使用查询的where子句中的数字以及能够获取版本号.

SELECT
    function1(...) as version1,
    function2(...) as version2,
    function3(...) as version3,
    function4(...) as version4
FROM Version
WHERE version1 > 5;
Run Code Online (Sandbox Code Playgroud)

Ale*_*x Q 3

经过一番尝试和错误后,我想出了以下查询来满足我的需要。基本上,我将数字与字符串末尾分开,然后在分隔下一个数字之前删除那么多字符。version1 列仅限于正 2 位数字,但在我的情况下这是我可以忍受的限制。

SELECT
    IF(CAST(RIGHT(SUBSTRING_INDEX(LEFT(version,CHAR_LENGTH(version) - CHAR_LENGTH(SUBSTRING_INDEX(version, '.', -3)) - 1), '.', -1),2) AS DECIMAL) > 0, 
        CAST(RIGHT(SUBSTRING_INDEX(LEFT(version,CHAR_LENGTH(version) - CHAR_LENGTH(SUBSTRING_INDEX(version, '.', -3)) - 1), '.', -1),2) AS DECIMAL), 
        CAST(RIGHT(SUBSTRING_INDEX(LEFT(version,CHAR_LENGTH(version) - CHAR_LENGTH(SUBSTRING_INDEX(version, '.', -3)) - 1), '.', -1),1) AS DECIMAL)) AS version1,
    SUBSTRING_INDEX(LEFT(version,CHAR_LENGTH(version) - CHAR_LENGTH(SUBSTRING_INDEX(version, '.', -2)) - 1), '.', -1) as version2,
    SUBSTRING_INDEX(LEFT(version,CHAR_LENGTH(version) - CHAR_LENGTH(SUBSTRING_INDEX(version, '.', -1)) - 1), '.', -1) as version3,
    SUBSTRING_INDEX(version, '.', -1) as version4
FROM Version
HAVING version1 >= 5
;
Run Code Online (Sandbox Code Playgroud)