Учитывая строку:
«Я думаю, что PostgreSQL отличный»
Я хотел бы оперировать отдельными словами, найденными в этой строке. По сути, у меня есть отдельный раздел, из которого я могу получить информацию о слове, и я хотел бы присоединить к этому словарю необъявленный массив этой строки.
Пока что у меня есть:
select word, meaning, partofspeech
from unnest(string_to_array('I think that PostgreSQL is nifty',' ')) as word
from table t
join dictionary d
on t.word = d.wordname;
Это завершает основы того, что я надеялся сделать, но не сохраняет первоначальный порядок слов.
postgresql
sorting
array
parse
swasheck
источник
источник
Ответы:
WITH ORDINALITY
в Postgres 9.4 или позжеНовая функция упрощает этот класс проблем. Вышеупомянутый запрос теперь может быть просто:
Или применительно к столу:
Детали:
О неявном
LATERAL
объединении:Postgres 9.3 или старше - и более общее объяснение
Для одной строки
Вы можете применить оконную функцию,
row_number()
чтобы запомнить порядок элементов. Однако, как обычно,row_number() OVER (ORDER BY col)
вы получаете числа в соответствии с порядком сортировки , а не с исходной позицией в строке.Вы можете просто пропустить,
ORDER BY
чтобы получить позицию «как есть»:Исполнение
regexp_split_to_table()
деградирует с длинными струнами.unnest(string_to_array(...))
весы лучше:Однако, хотя это обычно работает, и я никогда не видел, чтобы оно ломалось в простых запросах, Postgres ничего не утверждает относительно порядка строк без явного
ORDER BY
.Чтобы гарантировать порядковые номера элементов в исходной строке, используйте
generate_subscript()
(улучшено с комментарием @deszo):Для таблицы строк
Добавить
PARTITION BY id
вOVER
пункт ...Демо-таблица:
Я использую в
ctid
качестве специальной замены для первичного ключа . Если у вас есть один (или любой уникальный столбец ), используйте его вместо этого.Это работает без какого-либо четкого идентификатора:
SQL Fiddle.
Ответ на вопрос
источник
SELECT generate_series(1,array_length(word_array,1)), unnest(word_array) FROM ....
. 9.3LATERAL
могут предложить более хорошие решения этой проблемы.generate_subscripts(arr, 1)
работать вместоgenerate_series(1, array_upper(arr, 1))
? Я бы предпочел первое для ясности.