выберите строки, если столбец содержит элементы имени, любой порядок - PullRequest
1 голос
/ 24 июня 2019

У меня есть таблица, которая содержит несколько тысяч строк.Эти результаты были получены путем запроса API со списком имен.

Для поиска «John Snow» API вернул бы все записи в своей базе данных, которая содержала токен «john» и токен «snow».».Так что у меня много ложных срабатываний.

То, что я хотел бы сделать, это установить поднабор моей таблицы так, чтобы у меня были только записи, в которых столбец title (тот, который содержал строку, сопоставленную с моей строкой поиска) содержит ВСЕ элементы искомой строки независимо от порядка .

Я пытался

select * from table where 'john snow' ~* title;

select * from table where 'john snow' ILIKE '%' || title || '%';

оба работают, но только если столбец title содержит ровно john snow в этом порядке,

До

str_searched |  title
-------------+-------
john snow    | snow white
john snow    | john wick
john snow    | SNOW john
john snow    | john Snow
john snow    | Mr john snow

После

str_searched |  title
-------------+-------
john snow    | SNOW john
john snow    | john Snow
john snow    | Mr john snow

1 Ответ

2 голосов
/ 24 июня 2019

demo: db <> fiddle

SELECT
    *
FROM
    my_table
WHERE
    regexp_split_to_array(lower('john snow'), ' ') 
        <@ regexp_split_to_array(lower(title), ' ')
  1. lower() нормализует заглавные буквы
  2. regexp_split_to_array() преобразует текст в массив впробел
  3. Теперь у вас есть 2 массива, которые можно сравнивать (например, [john,snow] и [mr,john,snow]).Компаратор <@ проверяет, заполнен ли левый массив правым.


Отказ от ответственности: В действительно больших таблицах это может быть медленным.В этом случае я бы порекомендовал взглянуть на систему полнотекстового поиска: https://www.postgresql.org/docs/current/textsearch.html
...