在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 |

+-----------------------------+

我正在寻找每行的最后4位数字。数字始终是值的最后一部分,并且始终由点分隔。以下正则表达式将匹配我想要的所有值:

.*[[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+$

我希望得到的结果是一些功能组合,这些功能可以将每个数字捕获为一列,这样我就可以在查询的where子句中使用该数字,并能够获取版本号。

SELECT

function1(...) as version1,

function2(...) as version2,

function3(...) as version3,

function4(...) as version4

FROM Version

WHERE version1 > 5;

回答:

经过一番尝试和错误后,我想出了以下查询,它可以满足我的需要。基本上,我将数字从字符串末尾分离出来,然后在分离下一个数字之前删除那么多字符。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

;

以上是 在mysql中模拟正则表达式捕获组 的全部内容, 来源链接: utcz.com/qa/419256.html

回到顶部