使用 Regex 而不是 Case When?

时间:2021-07-19 04:57:14

标签: mysql sql

似乎我有一个占用 CPU 使用率的查询。我想知道使用正则表达式是否会更快:

GROUP_CONCAT(
    CASE
        WHEN b.column_1 LIKE '%Principal%' THEN CONCAT(a.start_date,  ' ~ ' , a.end_date, ' ', REPLACE(b.column_1, 'School Principal of', 'Principal') , ';', CHAR(10 using utf8) )
        ELSE ''
    END
ORDER BY a.start_date ASC SEPARATOR '') AS roles

这个想法是有一个类似于“2021-01-01 ~ 2022-01-01 Principal”的输出,其中column_1就像“School Principal of”或“Company Principal of”。

column_1 的正则表达式类似于“^.(principal).$”。是的,基本上只是抓取“Principal”(如果存在),如果不存在,则完全删除整个字符串。

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:1)

由于您知道匹配时所需的输出的固定格式,因此我认为甚至不需要在 column_1 上进行替换。使用这个版本:

GROUP_CONCAT(
    CASE WHEN b.column_1 LIKE '%Principal%'
         THEN CONCAT(a.start_date,  ' ~ ' , a.end_date, ' Principal')
         ELSE '' END
    ORDER BY a.start_date ASC SEPARATOR '') AS roles

请注意,您可以在此处使用 REGEXP 来匹配 Principal,但除非您真的担心单词边界,否则我可能会坚持使用 LIKE 方法您目前正在使用。

答案 1 :(得分:1)

  • LIKE 通常比等效的 REGEXP 快。
  • LIKE 没有前导通配符可以使用索引;我不相信 REGEXP 也是如此。
  • REGEXP (RLIKE) 具有更丰富的模式匹配功能。
  • REGEXP 'Principal' 相当于 LIKE '%Principal%'
  • . 只匹配一个字符。
  • 在 8.0 之前使用 [[:<:]][[:>:]] 作为单词边界;在 8.0 中使用 \\b

您查询的上下文是什么?如果您正在扫描表以获得此信息,那么将 LIKE 移到外部 WHERE 将比检查 CASE 内的每一行更快。< /p>