1

简短版本:我需要一个函数来转义字符串以在LIKE表达式中使用,所以fr_e%d变成fr\_e\%d.


我正在寻找转义查询结果而不需要使用替换。因为在这个结果中我有这个 char _ 里面的路径。并且因为我在 LIKE 语句中使用了这个结果,所以它使“_”成为像 start * 一样的小丑。

我必须使用 LIKE,因为我在同一个语句中做一些东西连接,需要我使用 LIKE 的事实。

我尝试 ~ 替换 LIKE 但我会遇到与 char '.' 相同的问题 因为 ~ 是使用正则表达式,所以也跳过这个解决方案。

4

2 回答 2

4
create function quote_like(text) returns text language sql immutable strict as
  $quote_like$
    select regexp_replace($1, $$[_%\\]$$, $$\\\&$$, 'g');
  $quote_like$;

此函数将所有出现的_,%\在提供的字符串中添加\. 例如,您可以像这样使用它:

select * from tablename
  where tablecolumn like
    '%'
    ||
    (select quote_like(substring) from substrings where substring_id=123)
    ||
    '%';
于 2012-11-06T23:19:04.350 回答
2

更新

由@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
于 2012-11-06T21:28:51.933 回答