如何排序SQL结果

时间:2013-06-15 08:24:14

标签: java sql oracle

我有SQL query我希望根据搜索参数获取颜色名称。 (数据库:Oracle10,前端:Java)

表(表1)

ID  COLORNAME
--- --------------------
1   Blue
2   Light Blue
3   Dark Blue
4   Dark Red
5   Light Red
6   Red

以下是我的查询,以获取包含Red字的颜色列表(搜索参数为Red

select * from table1
where colorname LIKE '%Red%'

输出:

ID  COLORNAME
--- --------------------
4   Dark Red
5   Light Red
6   Red

以上输出是正确的,但我希望首先显示以ColorName开头的Red,然后是包含单词Red的颜色。

期待:

ID  COLORNAME
--- --------------------
6   Red
4   Dark Red
5   Light Red

那么如何在查询中实现这一目标呢?

4 个答案:

答案 0 :(得分:2)

取决于你如何决定红色应该是第一个。 在你的具体情况

select * 
from table1
where colorname LIKE '%Red%'
order by nullif(colorname , 'Red') nulls first

答案 1 :(得分:1)

(select * from table1 where colorname = 'red')
union
(select * from table1 where colorname like '%red%' and colorname != 'red')

编辑:考虑到这一点,它实际上不是一种保证排序 - 但在所有情况下都会如此。

要保证这种方法必须这样做:

(select <cols>, colorname, 1 as i from table1 where colorname = 'red')
union
(select <cols>, colorname, 2 as i from table1 where colorname like '%red%' and colorname != 'red')
order by i, colorname

或者你可以使用@haki的建议

再次编辑,开始认为在某些dbms中实际上有一种更简单的方法:

select * from table1
where colorname like '%red%'
order by (colorname = 'red') desc, colorname

答案 2 :(得分:1)

我建议在数据模型中添加“系列”和“位置”:

ID  FAMILY POS COLORNAME  
--- --------------------  
4   Red    20  Dark Red  
5   Red    30  Light Red  
6   Red    10  Red  

然后你可以order by family, pos, colorname。定义任何其他排序模式都很灵活。

为了加快速度,您可以在这些列上添加索引:如果使用'%red%',则可能始终是全表扫描。

答案 3 :(得分:1)

将此扩展到更通用的标准,我认为完全匹配将是具有最小长度的匹配。

所以你可以:

with required_rows as (
  select t.*
         length(colorname)              length_colorname    ,
         min(length(colorname)) over () min_length_colorname
  from   table1
  where  colorname like '%Red%')
select   id,
         colorname
from     required_rows
order by case length_colorname
           when min_length_colorname then 0
           else 1
         end,
         colorname

如果您不需要排序其他行,那么您当然可以按长度排序(colorname)。