更新
由@Tometzky 的声明触发:
使用regexp_replace
比简单地更好replace
(...)
我不得不不同意。正则表达式函数功能强大但速度相对较慢。
因此,事件 3xreplace()
比单个简单的要快regexp_replace()
- 至少在我的测试中:
CREATE OR REPLACE FUNCTION quote_like2(text)
RETURNS text LANGUAGE SQL IMMUTABLE STRICT AS
$func$
SELECT replace(replace(replace(
$1
,'\', '\\') -- must come first
,'_', '\_')
,'%', '\%');
$func$;
请注意,我使用普通单引号而不是美元引号。这需要standard_conforming_strings = on
,这是自 PostgreSQL 9.1 以来的默认值。
使用您的数据尝试这两个功能:
EXPLAIN ANALYZE SELECT quote_like1(col) from tbl;
原始答案
与您的问题标题相反,您通常会使用replace()
或类似的字符串函数来准备您的模式。考虑这个演示:
SELECT 'abcde' LIKE ('abc_' || '%') -- TRUE
,'abc_e' LIKE ('abc_' || '%') -- TRUE
,'abcde' LIKE (replace('abc_', '_', '\_') || '%') -- FALSE
,'abc_e' LIKE (replace('abc_', '_', '\_') || '%'); -- TRUE