Следното трябва да работи, ако стойностите наистина са NULL и не са празни:
select id,
concat_ws('||', Phone1, Phone2, Phone3)
from t
Препратката е тук :
За да се справя с поръчката, бих избрал:
select id,
group_concat(phone Separator '||' order by phone) as ConcatPhones
from (select t.id,
(case when nums.n = 1 then phone1
when nums.n = 2 then phone2
when nums.n = 3 then phone3
end) as phone
from t cross join
(select 1 as n union all select 2 union all select 3) nums
) p
where phone is not null
group by id
Това ще филтрира всеки идентификатор, който няма телефонен номер.
Можете също да направите това с гигантски case
изявление, въпреки че това изглежда нещо като кошмар:
select t.id,
(case when phone1 < phone2 and phone2 < phone3 then concat_ws('||', phone1, phone2, phone3)
when phone1 < phone3 and phone3 < phone2 then concat_ws('||', phone1, phone3, phone2)
. . . through the remaining 4 permuatiations when all three are present
when phone1 is null and phone2 < phone3 then concat_ws('||', phone2, phone3)
. . . through the remaining 5 permutuations when one is NULL
when phone1 is null and phone2 is null then phone3
. . . through the remaining 2 permutations when two are NULL
end) as ConcatPhones
from t
Това е по-ефективно. Възможно е за 3 телефонни номера. Не бих искал да се занимавам, да речем, с пет от тях.