使用REGEXP在MySQL 5中返回特定的捕获组/子字符串

时间:2019-07-10 15:16:59

标签: mysql regex

我无法编写正则表达式来执行MySQL语法中需要的操作。

对于数据库表中的列http_referer,我具有以下值:

https://www.example.com?id=123&true

我需要返回查询字符串参数uid的值(在本例中为123),才能插入另一个查询。

`SELECT * FROM sites WHERE id = (http_referer REGEXP 'uid=([0-9]+)&?')

这是我的查询,不起作用,可能是因为我试图传递一个PHP样式的正则表达式,而不是一个MySQL可以使用的正则表达式(但是,我知道MySQL甚至不支持捕获组,所以我有点受困)。

2 个答案:

答案 0 :(得分:1)

如果您使用版本8之前的MySQL不支持REGEXP_REPLACE(),则可以使用SUBSTRING_INDEX()提取字符串的一部分:

mysql> set @a = 'some.domain?id=123&true';
mysql> select substring_index( substring_index(@a, '?id=', -1), '&', 1) as result;
+--------+
| result |
+--------+
| 123    |
+--------+

如果您感兴趣的参数的位置不是固定的(即并非总是第一个),或者紧随其后的参数是可选的并且可能不存在,那么它就比较棘手,您必须添加更多逻辑

答案 1 :(得分:0)

旧主题,但此解决方案可能对没有 mysql 版本 8 的人有所帮助。

2 条注释:

  • 您需要为每个字符设置一个案例。所以这个例子是为了 最多 3 个字符 (0 -999)。
  • 您不能在以下情况下使用此解决方案 您的字符串出现多次。例如 id=123&secondid=456&anotherid=789。

SELECT
       CONCAT(
               CASE WHEN content LIKE '%id=?1%' THEN '1' ELSE '' END,
               CASE WHEN content LIKE '%id=?2%' THEN '2' ELSE '' END,
               CASE WHEN content LIKE '%id=?3%' THEN '3' ELSE '' END,
               CASE WHEN content LIKE '%id=?4%' THEN '4' ELSE '' END,
               CASE WHEN content LIKE '%id=?5%' THEN '5' ELSE '' END,
               CASE WHEN content LIKE '%id=?6%' THEN '6' ELSE '' END,
               CASE WHEN content LIKE '%id=?7%' THEN '7' ELSE '' END,
               CASE WHEN content LIKE '%id=?8%' THEN '8' ELSE '' END,
               CASE WHEN content LIKE '%id=?9%' THEN '9' ELSE '' END,
               CASE WHEN content LIKE '%id=?0%' THEN '0' ELSE '' END,

               CASE WHEN content LIKE '%id=?_1%' THEN '1' ELSE '' END,
               CASE WHEN content LIKE '%id=?_2%' THEN '2' ELSE '' END,
               CASE WHEN content LIKE '%id=?_3%' THEN '3' ELSE '' END,
               CASE WHEN content LIKE '%id=?_4%' THEN '4' ELSE '' END,
               CASE WHEN content LIKE '%id=?_5%' THEN '5' ELSE '' END,
               CASE WHEN content LIKE '%id=?_6%' THEN '6' ELSE '' END,
               CASE WHEN content LIKE '%id=?_7%' THEN '7' ELSE '' END,
               CASE WHEN content LIKE '%id=?_8%' THEN '8' ELSE '' END,
               CASE WHEN content LIKE '%id=?_9%' THEN '9' ELSE '' END,
               CASE WHEN content LIKE '%id=?_0%' THEN '0' ELSE '' END,

               CASE WHEN content LIKE '%id=?__1%' THEN '1' ELSE '' END,
               CASE WHEN content LIKE '%id=?__2%' THEN '2' ELSE '' END,
               CASE WHEN content LIKE '%id=?__3%' THEN '3' ELSE '' END,
               CASE WHEN content LIKE '%id=?__4%' THEN '4' ELSE '' END,
               CASE WHEN content LIKE '%id=?__5%' THEN '5' ELSE '' END,
               CASE WHEN content LIKE '%id=?__6%' THEN '6' ELSE '' END,
               CASE WHEN content LIKE '%id=?__7%' THEN '7' ELSE '' END,
               CASE WHEN content LIKE '%id=?__8%' THEN '8' ELSE '' END,
               CASE WHEN content LIKE '%id=?__9%' THEN '9' ELSE '' END,
               CASE WHEN content LIKE '%id=?__0%' THEN '0' ELSE '' END
           ) id
FROM 'page?id=123' test WHERE test LIKE '%?id=%' and p.domain_id=18