September 7, 2010

В ожидании 9.1 - concat, concat_ws, right, left, reverse

Перевод Waiting for 9.1 - concat, concat_ws, right, left, reverse с select * from depesz;

24 августа Takahiro Itagaki применил патч:

Добавлены строковые функции: concat(), concat_ws(), left(), right()
и reverse().

Pavel Stehule, проверено мной.


Что это за функции?

concat() это просто функциональный аналог оператора || с возможностью обработки нескольких строк за раз:

$ SELECT concat( 'post', 'gres', 'ql' );
concat
------------
postgresql
(1 row)


Очень просто и полезно если надо сделать много конкатенаций.

concat_ws() похожа, но воспринимает первый аргумент как разделитель:

$ SELECT concat_ws( ' ', 'hubert', 'depesz', 'lubaczewski' );
concat_ws
---------------------------
hubert depesz lubaczewski
(1 row)


left() и right() делают одно и то же, но с разных сторон строки:

$ SELECT LEFT( 'postgresql', 4 );
LEFT
------
post
(1 row)


В общем это работает как substring(), но тут есть одна приятная возможность:

$ SELECT LEFT( 'postgresql', -2 );
LEFT
----------
postgres
(1 row)


Это значит, что если параметр длинны отрицательный, то функция будет обрезать abs(length) символов с "другой стороны".

Примеры для right():

$ SELECT RIGHT( 'postgresql', 3 );
RIGHT
-------
sql
(1 row)

$ SELECT RIGHT( 'postgresql', -4 );
RIGHT
--------
gresql
(1 row)


Это всё относительно просто можно было сделать раньше. Но последняя функция, по моему не такому уж скромному мнению, является наиболее важной - reverse(). Её задача тривиальна:

$ SELECT reverse( 'postgresql' );
reverse
------------
lqsergtsop
(1 row)


Но то, что она в ядре PostgreSQL означает что мы теперь можем сделать быстрый (индексный поиск) с условием вида LIKE '%something' ('%' в начале!). Техника для этого была описана ранее, но тогда небыло быстрой reverse().

No comments:

Post a Comment