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

英数字ソート

    ヒントは次のとおりです。並べ替えで問題が発生した場合は、select句にアイテムごとの順序を追加してください。これにより、並べ替えているものが実際に並べ替えたいものであるかどうかを確認できます。

    SELECT Section,
            CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
              LEFT(Section,PATINDEX('%[0-9]%',Section)-1)
            ELSE 
              Section
            END As alphabetical_sort, -- alphabetical sort
            CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
              CAST(SUBSTRING(Section,PATINDEX('%[0-9]%',Section),LEN(Section)) as float)
            ELSE
              NULL
            END As Numeric_Sort
    FROM dbo.Section
    ORDER BY alphabetical_sort, Numeric_Sort
    

    並べ替えが正しく行われた後、私がしなければならなかったのは、caseステートメントをorderby句に移動することだけです。

    SELECT Section
    FROM dbo.Section
    ORDER BY 
        CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
            LEFT(Section,PATINDEX('%[0-9]%',Section)-1)
        ELSE 
            Section
        END , -- Alphabetical sort
        CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
            CAST(SUBSTRING(Section,PATINDEX('%[0-9]%',Section),LEN(Section)) as float)
        ELSE
            NULL
        END  -- Numeric sort
    

    基本的に、4つの大きな問題がありました:

    • アルファベット順の並べ替え式では、すべての行に数値が含まれていると想定しています。
    • アルファベット順の並べ替え式に​​は、数字とテキストが含まれていました。
    • 数値の並べ替え式に​​数値とアルファベットの両方の値が含まれていました。
    • 第3条のため、数値の並べ替え式を数値型にキャストできませんでした。そのため、文字列の並べ替えが行われます。

    このSQLフィドルを参照



    1. C#任意の指定されたOracle日付形式で日付の文字列を解析する方法は?

    2. 多対多の関連付けを持つ複数の条件を持つデータを検索するためのSQL/Doctrineクエリ

    3. 挿入する前に重複データを確認してください

    4. PL / SQLブロックの一意性制約エラーをキャッチするにはどうすればよいですか?