我正在构建SQL查询,想知道使用posix正则表达式(如~,~*,!~,!~*
)或LIKE
和ILIKE
对这些查询的性能有何影响。使用这些中的任何一种是否会影响SQL查询的速度和性能?如果是,又是如何影响的?哪种更适合使用?
我正在构建SQL查询,想知道使用posix正则表达式(如~,~*,!~,!~*
)或LIKE
和ILIKE
对这些查询的性能有何影响。使用这些中的任何一种是否会影响SQL查询的速度和性能?如果是,又是如何影响的?哪种更适合使用?
LIKE
提供了一个简单的语法, 但没有太多的功能。根据另一个SO答案,LIKE
功能非常专业化,因此与等效的正则表达式相比可能更具性能优势。
并非所有文本都可以通过哪个更适合使用?
LIKE
进行匹配,因此在这些情况下,您将不得不使用正则表达式。但是,如果LIKE
已经足够,那么链接的答案建议使用它会更好。EXPLAIN ANALYZE
查看postgres实际要执行什么操作。〜波浪号表示区分大小写
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%';
!~* 排除/不包含(不区分大小写)
POSIX: SELECT record FROM mytable WHERE record !~ 'a';
LIKEi: SELECT record FROM mytable WHERE record not ilike '%a%';
可以在这里找到关于 POSIX 正则表达式、LIKE 和 ILIKE 的其他用法。
在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 |