SQL使用两个不同列的值进行排序

时间:2012-05-01 12:09:58

标签: java sql oracle hibernate sql-order-by

假设我有一个包含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然后是FAMILY。

所以看起来应该是这样的:

GIVEN  A
GIVEN  B
GIVEN  C
FAMILY A
FAMILY B

自然顺序首先是FAMILY,而不是GIVEN。

4 个答案:

答案 0 :(得分: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

但是你拥有的类型越多,案例表达就越不易管理。

答案 1 :(得分:1)

SELECT *
FROM name
ORDER BY 
  CASE 
        WHEN TYPE = 'GIVEN' THEN 1
        WHEN TYPE = 'FAMILY' THEN 2
        ELSE 3
     END,
  VALUE

这将按照TYPE和VALUE上的自定义顺序将结果排序为次要订单。

答案 2 :(得分:1)

ORDER BY CASE TYPE
             WHEN 'GIVEN' THEN 0   
             WHEN 'FAMILY' THEN 1
             ELSE 2
         END,
         VALUE

答案 3 :(得分: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