我真的不明白你爲什麼要墊這些多達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或一個空字符串。
你嘗試過什麼?您應該包含一些示例數據和預期結果。當你說填充空白字符時,你只是想要CHAR(163)還是你想要空格? – Matt
我一直在用Convert(CHAR(163),column)處理填充符,但這些實際上是4列有很多不同的場景,所以我不知道如何包裝整個事情。至於數據,我會嘗試添加更多的例子。 –
糟糕的餐桌設計。只有一個郵件列。 (並根據需要使用多行。) – jarlh