反转字符串
来自 PostgreSQL wiki
跳转到导航跳转到搜索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/