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

Oracleのレコードを複数の小数点(。)で並べ替える

    最大深度がわかっている場合は、セクションをサブセクションに分割できます。

    SQL> SELECT SECTION FROM DATA
      2   ORDER BY to_number(regexp_substr(SECTION, '[^.]+', 1, 1)) NULLS FIRST,
      3            to_number(regexp_substr(SECTION, '[^.]+', 1, 2)) NULLS FIRST,
      4            to_number(regexp_substr(SECTION, '[^.]+', 1, 3)) NULLS FIRST;
    
    SECTION
    -------
    1
    1.1
    1.1.2
    1.1.6
    6.1
    6.2
    [...]
    8.5
    10
    11
    

    サブセクションの最大深度が不明な場合(ただし、8ビット文字データベースでは数百未満、ANSI文字データベースでは数千未満)、ソートできない数字をソート可能な文字に変換する関数を定義できます。 :

    SQL> CREATE OR REPLACE FUNCTION order_section (p_section VARCHAR2)
      2     RETURN VARCHAR2 IS
      3     l_result VARCHAR2(4000);
      4  BEGIN
      5     FOR i IN 1..regexp_count(p_section, '[^.]+') LOOP
      6        l_result := l_result
      7                    || CASE WHEN i > 1 THEN '.' END
      8                    || CHR(64+regexp_substr(p_section, '[^.]+', 1, i));
      9     END LOOP;
     10     RETURN l_result;
     11  END;
     12  /
    
    Function created
    
    SQL> SELECT SECTION, order_section(SECTION)
      2    FROM DATA
      3   ORDER BY 2;
    
    SECTION ORDER_SECTION(SECTION)
    ------- -------------------------
    1       A
    1.1     A.A
    1.1.2   A.A.B
    1.1.6   A.A.F
    6.1     F.A
    6.2     F.B
    [...]
    8.5     H.E
    10      J
    11      K
    


    1. とにかくMySQLクエリの実行時間を制限しますか?

    2. LinuxにSQLServerをインストールする方法

    3. SQLを使用して上位3列の合計を見つける方法

    4. OracleSQLのif-elseif-else'条件'