PostgreSQL возвращает последние n слов

0

Как вернуть последние n слов, используя Postgres.

Я пытался с помощью метода левого

SELECT DISTINCT LEFT(name, -4) FROM my_table;

но он возвращает последние 4 символа, я хочу вернуть последние 3 слова.

  • 1
    Postgres или MySQL? И можно ли предположить, что слова разделены пробелами?
  • 0
    @stickybit postgres , да слова разделяются пробелами
Теги:

3 ответа

0

Один из способов - использовать 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;

дб <> скрипка

0

демо: дб <> скрипка

Вы можете сделать это, используя функцию SUBSTRING() и регулярные выражения:

SELECT 
    SUBSTRING(name FROM '((\S+\s+){0,3}\S+$)') 
FROM my_table

Это было объяснено здесь: Как я могу сопоставить последние два слова в предложении в PostgreSQL?

\S+ это строка \S+ символов

\S+ является строкой пробельных символов (например, один пробел)

(\S+\S+){0,3} нуля до трех слов, разделенных пробелом

\S+$ одно слово в конце текста.

→ создает 4 слова (или меньше, если их больше нет).

  • 0
    работал, но как я могу отличить этот запрос
  • 0
    Что вы имеете в виду? Разве вы не можете просто использовать предложение DISTINCT?
-3

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;

ДЕМО ЗДЕСЬ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню