これらを最大 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 は、すべての空でないアドレスの前にセミコロンを付けて、2 つの空でないアドレスの間にいくつの空のアドレスが発生するかを心配する必要がないようにします。これは、生成されるすべての結果がセミコロンで始まることを意味します。これが、クエリの最後の部分で左端の文字が取り除かれ、長さの計算に 163 ではなく 164 が使用される理由です。
ここで、「空の」メールとは、null または空の文字列のいずれかを意味すると想定しています。