我真的不明白为什么要填充这些最多 163 个字符,但这里有一个示例,它显示了空地址和非空地址的所有可能组合:
declare @MailsTable table
(
RowNumber int,
Mail1 varchar(40),
Mail2 varchar(40),
Mail3 varchar(40),
Mail4 varchar(40)
);
insert @MailsTable values
(0, null, null, null, null),
(1, 'Addr1', null, null, null),
(2, null, 'Addr2', null, null),
(3, 'Addr1', 'Addr2', null, null),
(4, null, null, 'Addr3', null),
(5, 'Addr1', null, 'Addr3', null),
(6, null, 'Addr2', 'Addr3', null),
(7, 'Addr1', 'Addr2', 'Addr3', null),
(8, null, null, null, 'Addr4'),
(9, 'Addr1', null, null, 'Addr4'),
(10, null, 'Addr2', null, 'Addr4'),
(11, 'Addr1', 'Addr2', null, 'Addr4'),
(12, null, null, 'Addr3', 'Addr4'),
(13, 'Addr1', null, 'Addr3', 'Addr4'),
(14, null, 'Addr2', 'Addr3', 'Addr4'),
(15, 'Addr1', 'Addr2', 'Addr3', 'Addr4');
with ConcatenatedAddressesCTE as
(
select
RowNumber,
Mails =
case when Mail1 != '' then ';' + Mail1 else '' end +
case when Mail2 != '' then ';' + Mail2 else '' end +
case when Mail3 != '' then ';' + Mail3 else '' end +
case when Mail4 != '' then ';' + Mail4 else '' end
from
@MailsTable
where
Mail1 != '' or Mail2 != '' or Mail3 != '' or Mail4 != ''
)
select
RowNumber,
FormattedMails = substring(Mails, 2, 200) + replicate(' ', 164 - len(Mails))
from
ConcatenatedAddressesCTE;
结果:
RowNumber FormattedMails
1 Addr1
2 Addr2
3 Addr1;Addr2
4 Addr3
5 Addr1;Addr3
6 Addr2;Addr3
7 Addr1;Addr2;Addr3
8 Addr4
9 Addr1;Addr4
10 Addr2;Addr4
11 Addr1;Addr2;Addr4
12 Addr3;Addr4
13 Addr1;Addr3;Addr4
14 Addr2;Addr3;Addr4
15 Addr1;Addr2;Addr3;Addr4
CTE 用分号为每个非空地址添加前缀,这样它就不必担心两个非空地址之间可能会出现多少个空地址。这意味着它产生的每个结果都以分号开头,这就是为什么查询的最后部分会去掉最左边的字符,以及为什么它在长度计算中使用 164 而不是 163。
我在这里假设当您说“空”邮件时,您可能指的是 null 或空字符串。