假设我有一个包含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。
答案 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