#regex #postgresql
#регулярное выражение #postgresql
Вопрос:
ОБНОВЛЕНИЕ: комментарии предполагают, что в данных могут быть некоторые невидимые пробелы и символы. Это, казалось, было источником проблемы.
У меня есть следующая таблица:
SELECT id, name FROM phototagging_category;
id | name
---- -----------------
1 | new
2 | hhh
3 | Más Habana
4 | Más Habana
(4 rows)
Когда я выполняю следующий запрос, я ожидаю, что последние две строки будут соответствовать регулярному выражению, но возвращается только последняя:
SELECT id, name
FROM phototagging_category WHERE UNACCENT(name) ~* 'mass habana';
id | name
---- ------------
4 | Más Habana
(1 row)
Я использую PostgreSQL 12 (изображение docker postgis / postgis: 12-3.0-alpine).
Есть идеи о том, почему 3-я строка не совпадает?
Комментарии:
1. Это должно сработать. Возможно, после Habana в 3-й записи есть дополнительный пробел или какой-либо другой невидимый символ?
2. Вероятно, там есть символ, который не виден, но также не считается пробелом. Что вы получите, если вы установите bytea_output на escape, тогда
select name::bytea FROM phototagging_category where id=3
?3. Не имея ваших данных, трудно предложить какое-либо точное решение, но я уверен
where UNACCENT(s) ~* 'masW habana'
, что оно сработает. Скорее всего, между ними есть какие-то невидимые символы, не содержащие пробеловMás
, иHabana
4. Я этого не проверял. По-видимому, были такие символы. После
update phototagging_category set name='Mas Habana' where id=3;
этого запрос вернул 3-ю строку.
Ответ №1:
Как было предложено в комментариях, в 3-й строке, похоже, были какие-то невидимые символы.
После обновления с помощью:
UPDATE phototagging_category SET name='Mas Habana' WHERE id=3;
Теперь строка отображается в результате запроса.