反转字符串

来自 PostgreSQL wiki
跳转到导航跳转到搜索

库代码片段

反转字符串

适用于 PostgreSQL

在 8.2+ 上测试

使用语言

PL/pgSQL

依赖于


reverse(text) 函数返回输入字符串,所有字符顺序反转。

这主要用于通过索引进行后缀模式匹配。例如

CREATE TABLE words (word text);
CREATE INDEX ON words (word text_pattern_ops);
CREATE INDEX ON words (reverse(word) text_pattern_ops);

然后编写类似这样的查询

SELECT * FROM words WHERE word LIKE 'ag%ng' AND reverse(word) LIKE reverse('ag%ng');

PostgreSQL 将自动选择一个或两个索引用于执行;例如

 Bitmap Heap Scan on words
   Filter: ((word ~~ 'ag%ng'::text) AND (reverse(word) ~~ 'gn%ga'::text))
   ->  BitmapAnd
         ->  Bitmap Index Scan on words_word_idx
               Index Cond: ((word ~>=~ 'ag'::text) AND (word ~<~ 'ah'::text))
         ->  Bitmap Index Scan on words_reverse_idx
               Index Cond: ((reverse(word) ~>=~ 'gn'::text) AND (reverse(word) ~<~ 'go'::text))

PostgreSQL 9.1+

PostgreSQL 9.1 及更高版本已经包含 reverse(text) 函数的内置版本(这里有文档说明

较慢的可移植 SQL 版本

这是一个简单且可移植的 SQL 语言实现,没有外部依赖。兼容 PostgreSQL 8.2+。

CREATE OR REPLACE FUNCTION reverse(text) RETURNS text AS $$
SELECT array_to_string(ARRAY(
  SELECT substring($1, s.i,1) FROM generate_series(length($1), 1, -1) AS s(i)
  ), '');
$$ LANGUAGE SQL IMMUTABLE STRICT;

来源:http://www.pgsql.cz/index.php/PostgreSQL_SQL_Tricks#LIKE_optimalization

可移植 PL/pgSQL 版本

这是一个可移植的 PL/pgSQL 实现,没有外部依赖,比上面提到的更快。兼容 PostgreSQL 8.2+。它是从 2005 年开始在邮件列表中多次发布的一个函数的稍微调整版本。

CREATE FUNCTION reverse(input text) RETURNS text
LANGUAGE plpgsql IMMUTABLE STRICT AS $$
DECLARE
  result text = '';
  i int;
BEGIN
  FOR i IN 1..length(input) BY 2 LOOP
    result = substr(input,i+1,1) || substr(input,i,1) || result;
  END LOOP;
  RETURN result;
END$$;

更快,PL/Perl 版本

对于较长的输入(10 个字符以上),此函数比上面提到的快得多,但在每个调用它的会话中都会产生 Perl 解释器开销。

CREATE FUNCTION reverse(text) RETURNS text
LANGUAGE plperl IMMUTABLE STRICT AS
'return reverse $_[0]';

来源:http://www.pgsql.cz/index.php/PostgreSQL_SQL_Tricks#LIKE_optimalization

最快,C 版本:orafce 扩展

PGXN 中,orafce 扩展(Oracle 兼容性函数)中提供了一个用 C 编写的更快版本:http://pgxn.org/dist/orafce/

原始的 Pgfoundry 项目已 存档