我有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
那么如何在查询中实现这一目标呢?
答案 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)。