使用逻辑运算符在 SQL 中排序
Ordering in SQL while using logical operators
我正在尝试编写具有 "OR" 运算符的 SQL 查询。问题是我希望它与某些人一起工作,比如 "priorities"。我有一个实体 Item,它有两个我在搜索中使用的字段:
- 描述
- 标题
并且有一个 SQL 查询:
select * from item
where description like '%a%' or title like '%a%';
我在这里想要的是,如果我们返回了两个实体,其中一个按描述匹配“%a%”,另一个按标题匹配,则通过标题匹配的实体应该是第一个列表。换句话说,它应该有更大的优先级。有什么方法可以让我在 SQL 中描述这样的目的吗?
方言:甲骨文/H2
在 Oracle 中,您可以使用 CASE
按值排序,使行按照与您的条件匹配的方式排序:
/* test case */
with item(title, description) as (
select '__x__', '__x__' from dual union all
select '__x__', '__a__' from dual union all
select '__a__', '__x__' from dual union all
select '__a__', '__a__' from dual
)
/* the query */
select *
from item
where description like '%a%' or title like '%a%'
order by case
when title like '%a%'
then 1
else 2
end
这给出:
TITLE DESCR
----- -----
__a__ __x__
__a__ __a__
__x__ __a__
我正在尝试编写具有 "OR" 运算符的 SQL 查询。问题是我希望它与某些人一起工作,比如 "priorities"。我有一个实体 Item,它有两个我在搜索中使用的字段:
- 描述
- 标题
并且有一个 SQL 查询:
select * from item
where description like '%a%' or title like '%a%';
我在这里想要的是,如果我们返回了两个实体,其中一个按描述匹配“%a%”,另一个按标题匹配,则通过标题匹配的实体应该是第一个列表。换句话说,它应该有更大的优先级。有什么方法可以让我在 SQL 中描述这样的目的吗?
方言:甲骨文/H2
在 Oracle 中,您可以使用 CASE
按值排序,使行按照与您的条件匹配的方式排序:
/* test case */
with item(title, description) as (
select '__x__', '__x__' from dual union all
select '__x__', '__a__' from dual union all
select '__a__', '__x__' from dual union all
select '__a__', '__a__' from dual
)
/* the query */
select *
from item
where description like '%a%' or title like '%a%'
order by case
when title like '%a%'
then 1
else 2
end
这给出:
TITLE DESCR
----- -----
__a__ __x__
__a__ __a__
__x__ __a__