删除文本 blob 中的空行

Delete empty lines in a text blob

我在名为 cc_list (blob(text)) 的 table 中有一个电子邮件地址列表。要从列表中删除电子邮件地址,我使用了替换功能

update actions 
set cc_list=replace(cc_list,'email@bob.com','') 
where contact_id=85

现在,列表显示为

email
email

email
email 

在 GUI 中,我只看到顶部的空行。我已经尝试 trim 选项删除回车 return (ascii_char(9))

trim(leading from replace (cc_list, ascii_char(9),'')) 

replace(cc_list,ascii_char(9),'') 

我仍然看到空行。

我该怎么做才能解决这个问题?

显而易见的解决方案是规范化您的数据库,而不是将事物列表存储在非结构化数据类型(如 blob)中,而是使用多对一解决方案来存储电子邮件地址。

您的替换留下换行符的原因是因为您只替换了电子邮件地址,所以用空字符串替换 <address1><LF><address2><LF><address3> 中的 <address2> 会留下 <address1><LF><LF><address3>

trim(leading ...) 不起作用的原因是因为它只对 blob 开头的白色 space 有效,你的换行符在 中间 [= blob 的 39=],此外,默认情况下 trim 仅修剪 spaces(字符 32)。

replace(..., ascii_char(9), '') 不起作用的原因是字符 9 是制表符,不是换行符(LF,字符 10),也不是回车符 return(CR,字符 13)。此外,尝试仅对单个换行符进行此替换会从 blob 中删除 all 换行符,使您的电子邮件地址无效,因为它们最终都将在一行中。

假设您的 blob 只包含换行符 (LF)(而不是回车符 return (CR) 或 CRLF),修复已经损坏的 blob 可以通过将所有出现的两个连续换行符替换为单个换行符来完成换行:

replace(cc_list, x'0a0a', x'0a')

(对 CR 使用 x'0d0d', x'0d',或对 CRLF 使用 x'0d0a0d0a', x'0d0a'

或(如果您使用的是不支持十六进制文字的 Firebird 版本):

replace(cc_list, ascii_char(10) || ascii_char(10), ascii_char(10))

下一步,您应该尝试用空字符串替换后跟换行符的电子邮件地址。请注意,这假定列表中的最后一个电子邮件地址后跟一个换行符:

replace(cc_list, 'email@bob.com' || ascii_char(10), '')