#sql #firebird #firebird-3.0
Вопрос:
У меня есть список адресов электронной почты в таблице под названием cc_list (большой двоичный объект(текст)). Чтобы удалить адрес электронной почты из списка, я использовал функцию замены
update actions
set cc_list=replace(cc_list,'email@bob.com','')
where contact_id=85
Теперь список отображается следующим образом
email
email
email
email
В графическом интерфейсе я просто вижу пустые строки вверху. Я попробовал опцию обрезки, удаляющую возврат каретки (ascii_char(9))
trim(leading from replace (cc_list, ascii_char(9),''))
и
replace(cc_list,ascii_char(9),'')
Я все еще вижу пустые строки.
Что я могу сделать, чтобы исправить это?
Комментарии:
1. Возврат кариажа-это не то же самое , что, по
ascii_char(9)
-моему, должно бытьascii_char(13)
, см.: theasciicode.com.ar/ascii-control-characters/…2. @Luuk на самом деле все еще более по-другому! DOS и OS/2 и Windows, это будет ПАРА символов 13, затем 10. Для UNIX (включая macOS X) это будет только 10, без 13. Для macOS classic это было бы 13 без 10.
3. @Arioch’The: Нет, CR (возврат каретки) всегда является символом(13), а LF (подача строки) всегда является символом(10), а CRLF-это комбинация этих двух символов.
4. @Luuk ах, хорошо, это правильно. Я исходил из
see the empty lines at the top
того, что я говорил обо ВСЕХ возможных маркерах конца строки, которые могут быть CR или LF или CR/LF — и, следовательно, обо всех них нужно заботиться. Конечно, в этом упрощенном случае, вероятно, было бы достаточно просто самостоятельно удалить все CRS и все LF
Ответ №1:
Очевидным решением было бы нормализовать вашу базу данных и не хранить список объектов в неструктурированном типе данных, таком как большой двоичный объект, а вместо этого использовать решение «много к одному» для хранения адресов электронной почты.
Причина, по которой ваша замена оставляет разрыв строки, заключается в том, что вы заменяете только адрес электронной почты, поэтому замена <address2>
на <address1><LF><address2><LF><address3>
пустую строку оставляет вас с <address1><LF><LF><address3>
.
Причина trim(leading ...)
не работает, потому что это работает только для пробела в начале большого двоичного объекта, разрыв строки находится в середине большого двоичного объекта, кроме того, по умолчанию trim
только пробелы (символ 32).
Причина replace(..., ascii_char(9), '')
не работает, потому что символ 9 является ВКЛАДКОЙ, а не переводом строки (LF, символ 10) или возвратом каретки (CR, символ 13). Кроме того, попытка этой замены только для одного разрыва строки приведет к удалению всех разрывов строк из большого двоичного объекта, что сделает ваши адреса электронной почты недействительными, поскольку все они окажутся в одной строке.
Предполагая, что ваш большой двоичный объект содержит только ввод строки (LF) (а не возврат каретки (CR) или CRLF), исправление уже поврежденных больших двоичных объектов можно выполнить, заменив все вхождения двух последовательных символов ввода строки одним вводом строки:
replace(cc_list, x'0a0a', x'0a')
(используйте x'0d0d', x'0d'
для CR или x'0d0a0d0a', x'0d0a'
для CRLF)
или (если вы используете версию Firebird, которая не поддерживает шестнадцатеричные литералы):
replace(cc_list, ascii_char(10) || ascii_char(10), ascii_char(10))
Двигаясь вперед, вы должны попытаться заменить адрес электронной почты, за которым следует разрыв строки, пустой строкой. Обратите внимание, что это предполагает, что за последним адресом электронной почты в списке также следует разрыв строки:
replace(cc_list, 'email@bob.com' || ascii_char(10), '')
Комментарии:
1. обновить message_actions установить cc_list = заменить(cc_list, ‘bob@email.com’,»); обновить MESSAGE_ACTIONS установить cc_list=заменить(cc_list ,x’0d0a0d0a’, x’0d0a’)
2. @LeoFazzi Вы можете сделать это с помощью одного обновления, используя:
update message_actions set cc_list = replace(cc_list, 'bob@email.com' || x'0d0a', '');