sql >> データベース >  >> RDS >> Mysql

CONCAT_WSの前に注文する

    値が実際に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
    

    これにより、電話番号を持たない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つの電話番号で実行可能です。たとえば、5つは扱いたくありません。




    1. ORDER BY NULLを指定したLISTAGGは、実際に注文基準として何を使用しますか?

    2. OracleにリンクされているSQLServerからSQLクエリを作成するときに、日付リテラルを指定するにはどうすればよいですか?

    3. C#を使用してMySQLのステートメントを更新する

    4. 番号順? IPアドレスの並べ替えを手伝ってください