3 回答

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個贊
~
是正則表達(dá)式運(yùn)算符,并具有其隱含的功能。您可以指定完整的正則表達(dá)式通配符和量詞;有關(guān)詳細(xì)信息,請參見文檔。它肯定比強(qiáng)大LIKE
,并且在需要此功能時應(yīng)使用,但它們具有不同的用途。

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超13個贊
LIKEIMO 沒有錯,也沒有理由~對此表示贊同。相反。LIKE是SQL標(biāo)準(zhǔn)的。也是SIMILAR TO,但并未得到廣泛支持。PostgreSQL ~ operator(或posix正則表達(dá)式匹配運(yùn)算符)不是SQL標(biāo)準(zhǔn)。
因此,我更喜歡LIKE在表達(dá)能力足夠的地方使用,并且僅~在需要完整正則表達(dá)式的功能時才使用。如果我需要移植數(shù)據(jù)庫,那將是一件痛苦的事。我傾向于使用SIMILAR TOwhen LIKE不夠強(qiáng)大的功能,但是在Erwin發(fā)表評論后,我想我會停止這樣做,而~在LIKE不工作時使用。
此外,PostgreSQL的可以使用前綴搜索(例如B-tree索引LIKE 'TEST%')用LIKE或SIMILAR TO如果數(shù)據(jù)庫是在C區(qū)域或索引有text_pattern_ops。與我之前寫的相反,Pg也可以為左錨posix正則表達(dá)式使用這樣的索引,它只需要一個顯式的'^ TEST。*',因此正則表達(dá)式只能從頭開始匹配。我之前的帖子錯誤地指出~不能使用索引進(jìn)行前綴搜索。消除了這種差異,實(shí)際上取決于您是否愿意堅(jiān)持使用標(biāo)準(zhǔn)兼容功能。
看到這個演示SQLFiddle ; 注意不同的執(zhí)行計(jì)劃。注意之間的差異~ '1234.*'和~ '^1234.*'。
給定樣本數(shù)據(jù):
create table test (
blah text
);
insert into test (blah) select x::text from generate_series(1,10000) x;
create index test_blah_txtpat_idx ON test(blah text_pattern_ops);
請注意,~即使在使用seqscan時,它也要使用索引,即使它實(shí)際上要昂貴得多(由于enable_seqscan之所以如此),因?yàn)樗鼊e無選擇LIKE。但是,~左錨定的校正也使用索引:
regress=# SET enable_seqscan = 'f';
SET
regress=# explain select 1 from test where blah ~ '12.*';
QUERY PLAN
---------------------------------------------------------------------------
Seq Scan on test (cost=10000000000.00..10000000118.69 rows=2122 width=0)
Filter: (blah ~ '12.*'::text)
(2 rows)
regress=# explain select 1 from test where blah like '12%';
QUERY PLAN
------------------------------------------------------------------------------------
Bitmap Heap Scan on test (cost=4.55..46.76 rows=29 width=0)
Filter: (blah ~~ '12%'::text)
-> Bitmap Index Scan on test_blah_txtpat_idx (cost=0.00..4.54 rows=29 width=0)
Index Cond: ((blah ~>=~ '12'::text) AND (blah ~<~ '13'::text))
(4 rows)
regress=# explain select 1 from test where blah ~ '^12.*';
QUERY PLAN
-------------------------------------------------------------------------------------
Bitmap Heap Scan on test (cost=5.28..51.53 rows=101 width=0)
Filter: (blah ~ '^12.*'::text)
-> Bitmap Index Scan on test_blah_txtpat_idx (cost=0.00..5.25 rows=100 width=0)
Index Cond: ((blah ~>=~ '12'::text) AND (blah ~<~ '13'::text))
(4 rows)
添加回答
舉報