I don't really get why you want to pad these up to 163 characters, but here's an example that shows all possible combinations of empty and non-empty addresses:
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;
Results:
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
The CTE prefixes every non-empty address with a semicolon so that it doesn't have to worry about how many empty addresses might occur between two non-empty addresses. This means that every result it produces will start with a semicolon, which is why the final part of the query strips off the leftmost character, and why it uses 164 rather than 163 in the length calculation.
I have assumed here that when you say an "empty" mail, you could mean either a null or an empty string.