2016-10-18 5 views
2

文字でソートし、次に数値でソートする必要があるアルファ数値の列値を扱っています。データのSQL英数字VARCHAR列の並べ替え

例:

  • AB21
  • ab22
  • A1A
  • A1B
  • AB2

    • A1
    • A10
    • A11
    • 次のように210

    をソートする必要があります

    • A1
    • A1A
    • A1B
    • A2
    • A3
    • AB1
    • AB2
    • AB
    • ...

    SQLでこれを並べ替える方法についてのアドバイスが必要です。

    ありがとうございました。

    +1

    を使用することにより、例えば、同様に大文字と小文字を区別しないソートを実行するために微調整することができるされています文字列の形式は一貫してまた、使用されているdbmsは何ですか? –

    +0

    数字の部分の前には1〜3文字が付いています。 – AlexVPerl

    +0

    ご使用のデータベースに質問にタグを付けてください。 –

    答えて

    0

    試しましたか?

    SELECT column_x 
    FROM table_name x 
    ORDER BY x.column_name ASC|DESC, x.column_name ASC|DESC; 
    
    1

    英数字は以下のとおりです。ただし、英数字以外の値については動作が定義されていないことに注意してください。

    WITH A (A, N) AS (
        SELECT A, 3 + LEN(A) FROM (
         SELECT 'a1' 
         UNION ALL 
         SELECT 'a10' 
         UNION ALL 
         SELECT 'a11' 
         UNION ALL 
         SELECT 'ab2' 
         UNION ALL 
         SELECT 'ab21' 
         UNION ALL 
         SELECT 'ab22' 
         UNION ALL 
         SELECT 'a1a' 
         UNION ALL 
         SELECT 'a1b' 
         UNION ALL 
         SELECT 'a1' 
         UNION ALL 
         SELECT 'a1a' 
         UNION ALL 
         SELECT 'a1b' 
         UNION ALL 
         SELECT 'a2' 
         UNION ALL 
         SELECT 'a3' 
         UNION ALL 
         SELECT 'a9' 
         UNION ALL 
         SELECT 'ab1' 
         UNION ALL 
         SELECT 'ab2' 
         UNION ALL 
         SELECT 'ab3' 
        ) T (A) 
    ), B (A, N, I, C, D, X) AS (
        SELECT A, N, 3, CAST(SUBSTRING(A, 1, 1) AS VARCHAR(255)), CAST(SUBSTRING(A, 2, 1) AS VARCHAR(255)), CAST('' AS VARCHAR(255)) FROM A 
        UNION ALL 
        SELECT A, N, I + 1, D, CAST(SUBSTRING(A, I, 1) AS VARCHAR(255)), CASE WHEN ASCII(C) BETWEEN 48 AND 57 AND ASCII(D) BETWEEN 48 AND 57 THEN CAST(X + CHAR(10 + ASCII(D)) AS VARCHAR(255)) WHEN 58 > ASCII(C) THEN CAST(X + C AS VARCHAR(255)) ELSE CAST(X + CHAR(3 + ASCII(C)) AS VARCHAR(255)) END FROM B WHERE I <= N 
    ) 
    SELECT A FROM B WHERE I = N 
    ORDER BY X COLLATE Latin1_General_BIN 
    

    コードは、現在ケースセンシティブな方法でソートするが、

    ORDER BY UPPER(X) COLLATE Latin1_General_BIN 
    

    又は

    ORDER BY LOWER(X) COLLATE Latin1_General_BIN 
    
    関連する問題