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。

我怎样才能做到这一点?此外,非常感谢使用 Hibernate Criteria 执行此操作的方法。

编辑:我需要按我定义的特定顺序对 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

但是你拥有的类型越多,case 表达式就越难管理。

于 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 上的自定义订单对结果进行排序,作为二级订单。

于 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

感觉有点“hacky”,但它有效

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 回答