Почему PostgreSQL не сопоставляет несколько пробелов с регулярным выражением «s «

#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;
 

Теперь строка отображается в результате запроса.