[РЕДАКТИРОВАНИЕ] оригинальное название этого вопроса "Получало последний элемент массива Пост-ГРЭС, декларативно"
Как получить последний элемент массива в Пост-ГРЭС?
Я должен сделать это декларативно, поскольку я хочу использовать его в качестве ORDER BY критерии. Я не хотел бы создавать специальную функцию PGSQL для него, чем меньше изменений в базе данных, тем лучше в этом случае.
На самом деле то, что я хочу сделать, должно отсортировать по последнему слову определенного столбца, содержащего несколько слов. Изменение модели не является опцией здесь.
Другими словами, я хочу продвинуть Ruby sort_by {|x| x.split[-1]}
на уровень базы данных. Я могу разделить значение на массив слов с Пост-ГРЭС string_to_array
или regexp_split_to_array
функции, затем как получить его последний элемент?
Используйте array_upper () :
SELECT array_upper(ARRAY[1,2,5,6], 1);
Отредактировано: ЭТО НЕПРАВИЛЬНО - ПРАВИЛЬНЫЙ ОТВЕТ СМ. НИЖЕ -
Думаю, вы должны использовать array_length ()
:
SELECT string_to_array('hi guys, welcome', ' ') AS arr INTO temparr;
SELECT * FROM temparr;
arr
----------------------
{hi,"guys,",welcome}
SELECT arr[array_length(arr,1)] FROM temparr;
arr
---------
welcome
Чтобы использовать это декларативно (на лету), вы можете создать небольшую функцию SQL:
CREATE FUNCTION last_elem (text[]) RETURNS text AS $$
SELECT $1[array_length($1,1)];
$$ LANGUAGE SQL;
select last_elem(string_to_array('hi guys, welcome', ' '));
last_elem
-----------
welcome
------- РЕДАКТИРОВАТЬ - ПРАВИЛЬНЫЙ ОТВЕТ СЛЕДУЕТ ----------------------
Выше неверно, потому что в Postgresql массивы иногда могут быть неоднородными.
Правильный способ - использовать array_upper ()
CREATE FUNCTION last_elem (text[]) RETURNS text AS $$
SELECT $1[array_upper($1,1)];
$$ LANGUAGE SQL;
select last_elem(string_to_array('hi guys, welcome', ' '));
last_elem
-----------
welcome