#sql #postgresql
#sql #postgresql
Вопрос:
У нас есть база данных, в которой наш клиент один раз набрал «Боб», а другой раз «Боб». (Обратите внимание на небольшое различие между одинарной кавычкой и апострофом.)
Когда кто-то ищет «Боб» или «Bob’s», я хочу найти все случаи, независимо от того, что они использовали для апострофа.
Единственное, что я могу придумать, это просматривать запросы людей и заменять каждое вхождение того или иного с (’|'')
(обратите внимание на экранированную одинарную кавычку) и использовать АНАЛОГИЧНО .
SELECT * from users WHERE last_name SIMILAR TO 'O(’|'')Dell'
Есть ли лучший способ, в идеале какой-то параметр, который позволяет им быть взаимозаменяемыми?
Ответ №1:
Вы можете использовать соответствие регулярному выражению
with a_table(str) as (
values
('Bob''s'),
('Bob’s'),
('Bobs')
)
select *
from a_table
where str ~ 'Bob[''’]s';
str
-------
Bob's
Bob’s
(2 rows)
Лично я бы заменил все апострофы в таблице одним запросом (у меня была такая же проблема в одном из моих проектов).
Комментарии:
1. Спасибо. Есть ли у этого какое-либо преимущество перед «ПОДОБНЫМ»?
2. Смотрите Сопоставление шаблона с ПОДОБНЫМИ, СХОЖИМИ С или регулярными выражениями в PostgreSQL
Ответ №2:
Если вы обнаружите, что оба приведенных выше случая допустимы и содержат одну и ту же информацию, тогда вы можете подумать о том, чтобы позаботиться о своих данных до того, как они поступят в базу данных для последующего извлечения. Это означает, что вы могли бы эффективно заменить один знак на другой в коде вашего приложения или before insert
триггере.
Если у вас есть больше случаев, подобных тому, который вы упомянули, то, к сожалению, указание только LIKE
запросов было бы правильным решением.
Вы также можете рассмотреть подсказки для своего клиента при создании другого пользователя, который будет извлекать записи из базы данных и возвращать наиболее близкие совпадения, если таковые имеются, чтобы избежать таких проблем.
Я боюсь, что нет настройки, которая делает два из этих символов одинаковыми в DQL Postgres. По крайней мере, я не знаком с одним.
Комментарии:
1. Я ненавижу манипулировать вводимыми данными, тем более что у нас задействовано несколько языков, и могут быть случаи, когда пользователь действительно хочет использовать один над другим. Я надеялся на настройку «обрабатывать апострофы как одинарные кавычки», но не удивлен, что ее не существует.
2. Независимо от того, используете ли вы сопоставление SIMILAR TO, LIKE или REGEX, вам все равно придется писать их оба. Вы также можете включить это в свою функцию и создать функциональный индекс 🙂