#postgresql
Есть строка '67 469 250 004' (взятая, вообще, из поля таблицы, с которым нужно провести эту операцию (удаление проблеов)). Это текстовое поле. Изначально сама талица была с кодировкой utf-8 (если это имеет какое-то значение). Не работает ни одна из команд, выдает исходную строку. select '67 469 250 004' , replace('67 469 250 004', ' ', '') , regexp_replace('67 469 250 004', '\\s* ', '', 'g') , trim('67 469 250 004') в regexp_replace я пробовала разные комбинации на месте '\s*' ('\s', '\s*', ' ').
Ответы
Ответ 1
В hex представлении вашей исходной строки 67 469 250 004 выглядящем как 3637c2a0343639c2a0323530c2a0303034 После сверки с вручную набранным эквивалентом с пробелами выглядящем в hex как: 3637203436392032353020303034 На месте пробелов (20 во всех основанных на ASCII кодировках) обнаруживаем последовательность байт c2 a0. Зная из вопроса, что у вас используется utf8 - идем в таблицу юникода и в общем-то сразу же находим что это символ NO-BREAK SPACE. Вполне ожидаемое для него место на самом деле. Программа, которая писала эти данные, оставила пожелание при дальнейшем выводе значения не разбивать его на несколько строк. Интересно, что этот символ не входит в маску \s регулярного выражения. Удалить возможно вот так указав неразрывный пробел (специально в hex для читаемости): select replace(input_value, E'\xc2\xa0', ''); Либо для задачи удалить из строки все не числовые символы можно именно так регулярное выражение и написать: select regexp_replace(input_value, '\D+', '', 'g');
Комментариев нет:
Отправить комментарий