sql >> Databasteknik >  >> RDS >> Mysql

Beställ före CONCAT_WS

Följande bör fungera, om värdena verkligen är NULL och inte tomma:

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

Referensen finns här :

För att hantera beställningen skulle jag välja:

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

Detta kommer att filtrera bort alla ID som inte har ett telefonnummer.

Du kan också göra detta med ett gigantiskt case uttalande, även om det verkar vara något av en mardröm:

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

Detta är mer effektivt. Det är möjligt för 3 telefonnummer. Jag skulle inte vilja ta itu med, säg, fem av dem.




  1. Ansluta en Bastion Server till en PostgreSQL Server via SSH Tunnel

  2. MySQL:Hur tar jag reda på vilka tabeller som refererar till en specifik tabell?

  3. hur uppdaterar man ett specifikt fält(kolumn) i en rad med den radens autoinkrementvärde med något prefix i mysql?

  4. PostgreSQL-säkerhetskopieringsmetodfunktioner i AWS S3