2

PART_TYPE列とVALUE列を持つテーブルNAMEがあるとします。各タイプには、FAMILY、GIVEN、PREFIXなどの複数のタイプを含めることができます。

私がやりたいのは、すべての名前を取得するSQLを作成することですが、最初に特定のタイプで並べ替えてから、そのタイプ内でアルファベット順に並べ替えます。

私はこのようなものを持っています:

SELECT *
FROM name
ORDER BY (
  CASE
    WHEN PART_TYPE = 'GIV'
    THEN VALUE
  END)

しかし、VALUEをセカンダリオーダーとして保持しながら、他のタイプをプライマリオーダーとして含める方法がわかりません。別のcaseステートメントを追加すると、VALUEがプライマリオーダーになります。

このデータベースを独立させたいのですが、必要に応じて、Oracle固有のデータベースにするつもりです。

これどうやってするの?また、HibernateCriteriaを使用してこれを行う方法も非常に高く評価されます。

編集:PART_TYPEは、自分で定義した特定の順序で並べ替える必要があります。特に、それは与えられてから家族である必要があります。

したがって、次のようになります。

GIVEN  A
GIVEN  B
GIVEN  C
FAMILY A
FAMILY B

による自然な秩序は、与えられたものではなく、最初に家族を持つでしょう。

4

4 に答える 4

2

これを解決する最も管理しやすい方法は、おそらくすべてのタイプを含むテーブルを作成し、その中に並べ替え列を作成することです。したがって、次のようなテーブルがある可能性があります。

TypeID      Name      SortOrder
1           FAMILY    2
2           GIVEN     1
3           PREFIX    3

次に、これをクエリに結合して使用できます。

ORDER BY SortOrder, Value

CASEこれは式で解決できます

ORDER BY CASE Type
            WHEN 'GIVEN' THEN 1
            WHEN 'FAMILY' THEN 2
            WHEN 'PREFIX' THEN 3
            END,
            Value

ただし、タイプが多いほど、ケース式は管理しにくくなります。

于 2012-05-01T12:22:03.473 に答える
1
SELECT *
FROM name
ORDER BY 
  CASE 
        WHEN TYPE = 'GIVEN' THEN 1
        WHEN TYPE = 'FAMILY' THEN 2
        ELSE 3
     END,
  VALUE

これにより、結果はTYPEおよびVALUEのカスタムオーダーで2次オーダーとして順序付けられます。

于 2012-05-01T12:13:38.077 に答える
1
ORDER BY CASE TYPE
             WHEN 'GIVEN' THEN 0   
             WHEN 'FAMILY' THEN 1
             ELSE 2
         END,
         VALUE
于 2012-05-01T12:20:42.303 に答える
0

少し「ハッキー」な感じがしますが、動作します

SELECT part_type,name
FROM (
SELECT 
CASE 
WHEN part_type = 'Given' THEN 'A'
WHEN part_type = 'Family' THEN 'B'
END AS Sorthack,
part_type,
name
FROM NAME
) Sort

ORDER BY sorthack,name
于 2012-05-01T12:33:29.193 に答える