【问题标题】:REGEX performance in SQLSQL 中的正则表达式性能
【发布时间】:2020-02-08 15:06:44
【问题描述】:

我想选择所有以元音字符开头和结尾的城市。我看到了不同的方式,但我很困惑哪一种性能更好?

select distinct city from the station 

SELECT DISTINCT CITY
FROM station
WHERE left(city, 1) IN (
        'a'
        ,'e'
        ,'i'
        ,'o'
        ,'u'
        )
    AND right(city, 1) IN (
        'a'
        ,'e'
        ,'i'
        ,'o'
        ,'u'
        )

使用正则表达式的第二种方式:

SELECT DISTINCT CITY
FROM station
WHERE city regexp '[aeiou]$'
    AND city IN (
        SELECT CITY
        FROM STATION
        WHERE CITY REGEXP '^[aeiou]'
        );

最后一种方法是:

SELECT DISTINCT city
FROM station
WHERE (
        lower(city) LIKE 'a%'
        OR lower(city) LIKE 'e%'
        OR lower(city) LIKE 'i%'
        OR lower(city) LIKE 'o%'
        OR lower(city) LIKE 'u%'
        )
    AND (
        lower(city) LIKE '%a'
        OR lower(city) LIKE '%e'
        OR lower(city) LIKE '%i'
        OR lower(city) LIKE '%o'
        OR lower(city) LIKE '%u'
        )

哪个更好,为什么?

【问题讨论】:

  • 正确标记。 MySQL 不是 TSQL,它们使用不同的 sql 方言。 TSQL 没有正则表达式函数。

标签: mysql regex database


【解决方案1】:

我会推荐正则表达式,但是像这样:

select distinct city
from station 
where city regexp '^[aeiou].*[aeiou]$'; 

即单个正则表达式。

至于什么是最好的。 . .这取决于您对“最佳”的定义。更简单的字符串操作(left()right())可能比正则表达式有更好的性能(你应该检查一下;这并不总是正确的)。

我更喜欢这个,因为它简洁且完全符合您提出的问题。

【讨论】:

  • 请你解释一下你输入的正则表达式,如果你能推荐一些资源来掌握 SQL 中的正则表达式 谢谢
  • @heshamahmed 。 . . SQL 中的正则表达式就像其他任何地方的正则表达式(或足够接近)。网络上有许多教程和解释可以帮助您学习它们。
  • 为了性能,这个查询可能是最快的——大多数解决方案需要获取所有行;获取行是大部分工作。 Regexp vs LEFT vs etc 是次要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2013-04-13
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多