regex 与PostgreSQL中的LIKE和ILIKE相比,使用POSIX正则表达式有什么优势?

up9lanfz  于 2023-05-01  发布在  PostgreSQL
关注(0)|答案(3)|浏览(193)

我正在构建SQL查询,我想知道使用posix正则表达式(如~ , ~* , !~ , !~*)或LIKEILIKE如何影响这些查询的性能。使用其中任何一个会影响SQL查询的速度和性能吗?如果是,如何进行?哪一种更适合使用?

jvlzgdj9

jvlzgdj91#

regex/like操作符需要在数据库中发生一些事情,所以它们当然会以某种方式影响性能。但它们都有特定的功能
LIKE提供了一个简单的语法,但没有太多的功能。根据another SO answerLIKE的功能是非常专门的,因此与等效的正则表达式相比,性能可能更高。
哪一种更适合使用?
不是所有的文本都可以用LIKE匹配,所以在这种情况下,你必须使用正则表达式。但是如果LIKE足够,那么相关的答案表明使用它会更好。
如果您关心特定的查询,请使用postgres的EXPLAIN ANALYZE来查看postgres实际上要做什么。

2wnc66cl

2wnc66cl2#

根据我的研究,POSIX正则表达式比使用LIKE和ILIKE子句更适用,因为它有一些优点:
1.速度
1.简单子句查询
以下是posix正则表达式的一些用法示例:
~波浪号表示区分大小写

POSIX: SELECT record FROM mytable WHERE record ~ 'a';
LIKEi: SELECT record FROM mytable WHERE record like '%a%';

~* 表示不区分大小写

POSIX: SELECT record FROM mytable WHERE record ~* 'a';
LIKEi: SELECT record FROM mytable WHERE record ilike '%A%';

!~排除/不排除(区分大小写)

POSIX: SELECT record FROM mytable WHERE record !~ 'a';
LIKEi: SELECT record FROM mytable WHERE record not like '%a%';

!~* exclude/not(不区分大小写)

POSIX: SELECT record FROM mytable WHERE record !~ 'a';
LIKEi: SELECT record FROM mytable WHERE record not ilike '%a%';

posix regex、LIKE和ILIKE的一些其他用法可以在here中找到。

7nbnzgx9

7nbnzgx93#

Ohn Igneel的例子的变体,

create temporary table test(
c1 varchar
);
insert into test values ('Andrea'), ('Luis'), ('Thomas'), ('Maria');

-- ~ tilde for case sensitive
SELECT c1 from test WHERE c1 ~ 'A';
SELECT c1 from test WHERE c1 like '%A%'; 
|c1    |
|------|
|Andrea|
-- ~* for case insensitive
SELECT c1 from test WHERE c1 ~* 'a';
SELECT c1 from test WHERE c1 ilike '%A%';
|c1    |
|------|
|Andrea|
|Thomas|
|Maria |
-- !~ exclude/not (case sensitive)
SELECT c1 from test WHERE c1 !~ 'm';
SELECT c1 from test WHERE c1 not like '%m%';
|c1    |
|------|
|Andrea|
|Luis  |
|Maria |
-- !~* exclude/not (case insensitive)
SELECT c1 from test WHERE c1 !~* 'M';
SELECT c1 from test WHERE c1 not ilike '%M%';
|c1    |
|------|
|Andrea|
|Luis  |

相关问题