Как восстановить разницу двух векторов в postgres?

У меня есть два поля varchars, я хотел бы получить массив слов, которые присутствуют в одном из них, а не присутствуют в другом, то есть:

old_text := to_tsvector("The quick brown fox jumps over the lazy dog")
new_text := to_tsvector("The slow brown fox jumps over the quick dog at Friday")
-> new words: ARRAY["slow", "at", "Friday"] ( the order of words doesn't matter )

Я попытался поиграться с ts_vectors, но не повезло.. Есть ли другие функции в postgres, которые поддерживают что-то подобное?

1 ответ

Решение

Если вы действительно хотите задействовать текстовый поиск, взгляните на ts_parse(),

SELECT token
FROM ts_parse('default', 'The slow brown fox jumps over the quick dog at Friday')
WHERE tokid != 12 -- blank
EXCEPT
SELECT token
FROM ts_parse('default', 'The quick brown fox jumps over the lazy dog')
WHERE tokid != 12 -- blank

-- will give you

"token"
--------
'slow'
'at'
'Friday'

Или, вы можете использовать регулярные выражения для этого:

SELECT *
FROM regexp_split_to_table('The slow brown fox jumps over the quick dog at Friday', '\s+')
EXCEPT
SELECT *
FROM regexp_split_to_table('The quick brown fox jumps over the lazy dog', '\s+')

В конце используйте array_agg() для накопления результатов в массив, если это необходимо.

Другие вопросы по тегам