Как вернуть последние n слов, используя Postgres.
Я пытался с помощью метода левого
SELECT DISTINCT LEFT(name, -4) FROM my_table;
но он возвращает последние 4 символа, я хочу вернуть последние 3 слова.
Один из способов - использовать regexp_split_to_array()
чтобы разбить строку на содержащиеся в ней слова, а затем собрать строку обратно, используя последние 3 слова в этом массиве.
SELECT coalesce(w.words[array_length(w.words, 1) - 2] || ' ', '')
|| coalesce(w.words[array_length(w.words, 1) - 1] || ' ', '')
|| coalesce(w.words[array_length(w.words, 1)], '')
FROM mytable t
CROSS JOIN LATERAL (SELECT regexp_split_to_array(t."name", ' ') words) w;
Вы можете сделать это, используя функцию SUBSTRING()
и регулярные выражения:
SELECT
SUBSTRING(name FROM '((\S+\s+){0,3}\S+$)')
FROM my_table
Это было объяснено здесь: Как я могу сопоставить последние два слова в предложении в PostgreSQL?
\S+
это строка \S+
символов
\S+
является строкой пробельных символов (например, один пробел)
(\S+\S+){0,3}
нуля до трех слов, разделенных пробелом
\S+$
одно слово в конце текста.
→ создает 4 слова (или меньше, если их больше нет).
RIGHT()
должен делать
SELECT RIGHT('MYCOLUMN', 4); -- returns LUMN
UPD
Вы можете преобразовать в массив, а затем обратно в строку
SELECT array_to_string(sentence[(array_length(sentence,1)-3):(array_length(sentence,1))],' ','*')
FROM
(
SELECT regexp_split_to_array('this is the one of the way to get the last four words of the string', E'\\s+') AS sentence
) foo;