【问题标题】:MySQL pattern matching - finding the matchMySQL 模式匹配 - 找到匹配项
【发布时间】:2017-07-19 05:23:30
【问题描述】:

我正在使用包含大量数据(大约 10.000 条记录)的 MySQL 数据库。数据库中的数据是机器维护的记录,其中一个字段包含一个基本时间线(只是带有时间戳的步骤),解释了所有完成的工作。在此字段中,我正在寻找可以指示某些过程的某些字符串(即 ABC123.ABC、abc111.abc、abc001.abc)。

我正在此字段中寻找具有类似模式匹配的匹配项

SELECT * FROM [tablename]
WHERE `work_performed` LIKE '% ______.___ %'
ORDER BY id DESC;`

正则表达式非常通用,但我可以自己进一步指定。

但是,由于包含我要查找的字符串的字段可能非常大(最多 2364763 个字符),我想返回与指定模式匹配的记录,但我也想返回一个仅包含匹配项的字段表达式,因此我可以确认它实际上是我正在寻找的内容,并且可以进一步使用该字符串。

我发现有人遇到同样的问题,但我无法重现他们的结果。 像这样的东西可能有用吗?:

SELECT *, SUBSTRING(`work_performed`, 
patindex('%[0-9][0-9][0-9]%', `work_performed`)-1, 5) as match
FROM [tablename]
WHERE `work_performed`LIKE '% ______.___ %'

我希望得到类似这样的输出:

+----+-------------------------------------------+------------+
| id |              work_performed               |   match    |
+----+-------------------------------------------+------------+
|  1 | 2017-02-26|10:59| Arrival: admin1         | ABCD12.adb |
|    | 2017-02-26|10:59| diagnosed error ab-0001 |            |
|    | 2017-02-26|11:02| ran ABCD12.adb          |            |
|    | 2017-02-26|11:03| system back online      |            |
+----+-------------------------------------------+------------+
|  2 | 2017-02-26|10:59| Arrival: admin34        | abc123.ags |
|    | 2017-02-26|10:59| diagnosed error WP1234  |            |
|    | 2017-02-26|11:02| ran abc123.ags          |            |
|    | 2017-02-26|11:03| system back online      |            |
+----+-------------------------------------------+------------+

如果我没有提供足够的细节,我深表歉意,但我是一家大公司的实习生,我们对保密有非常严格的规定。

如果需要任何其他信息,我会尽力提供。

编辑

我一直在尝试使用正则表达式搜索我正在寻找的字符串,但我无法让它按我的意愿工作,这是我尝试过的:

SELECT * FROM tablename
WHERE `work_performed` regexp '% ([a-z]^3)([0-9]^3).([a-z]^3) %'
ORDER BY id DESC;

【问题讨论】:

  • 您想match 模式,还是实际上也想extract 匹配?请注意,仅使用 MySQL 很难生成您的预期输出。您很可能会在表示层中生成它。
  • 我想选择在指定字段中匹配的所有行,但我想显示触发匹配的原因,因为日志的条目有时是手工完成的,我真的不能指望它们100% 正确。因此,我想看看比赛本身是什么。
  • 可能只有一个点.?
  • @RomanPerekhrest 没错。在我正在寻找的程序名称中只能有一个点

标签: mysql database pattern-matching data-analysis


【解决方案1】:

使用CONCAT、SUBSTR、SUBSTRING_INDEX和LOCATE函数的解决方案:

SELECT 
    CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(work_performed, '.', 1), ' ', - 1),
        '.',
        SUBSTR(SUBSTRING_INDEX(work_performed, '.', - 1), 1,
            LOCATE(' ', SUBSTRING_INDEX(work_performed, '.', - 1))
        )
    ) m
FROM
    tablename

https://dev.mysql.com/doc/refman/5.7/en/string-functions.html

DEMO link

【讨论】:

  • 感谢您抽出宝贵时间回答。这非常适合该示例,但不幸的是不够具体,我得到的各种记录实际上与我在问题中指定的模式不匹配(_.___)。让我获得正确匹配率最高的是正则表达式:'% ______.___ %'。但我不能在选择中使用它。有没有办法指定 substr 以更好地匹配?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
相关资源
最近更新 更多