sql >> Database >  >> RDS >> Mysql

Bestel vóór CONCAT_WS

Het volgende zou moeten werken, als de waarden inderdaad NULL zijn en niet leeg:

select id,
       concat_ws('||', Phone1, Phone2, Phone3)
from t

De referentie is hier :

Om het bestellen af ​​te handelen, zou ik gaan voor:

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

Dit filtert elke id die geen telefoonnummer heeft weg.

Je kunt dit ook doen met een gigantische case verklaring, hoewel dat een beetje een nachtmerrie lijkt:

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

Dit is efficiënter. Het is mogelijk voor 3 telefoonnummers. Ik zou er geen vijf willen behandelen.




  1. Hernoem outfile met datum in mysql

  2. Kan waarde '2012-04-05 10:20:00' niet converteren van kolom XX naar TIMESTAMP

  3. Elke kolom in een tabel indexeren

  4. Identiteitseigenschap van een kolom in SQL Server-tabel laten vallen - SQL Server / T-SQL-zelfstudie 44