我想知道在 sql server 中是否有任何方式可以根据哪些行首先满足条件来对行进行排序,例如,如果我正在编写这样的查询
SELECT * FROM IMAGES
WHERE NAME LIKE '%TEST%'
AND DESCRIPTION LIKE '%TEST%'
Run Code Online (Sandbox Code Playgroud)
我希望与名称匹配的行出现在与描述匹配的行之前,通常 sql server 会按它们的 ID 排列它们,所以......无论如何要这样做?!(注意:我不想使用 union 语句,因为这会耗尽数据库)。
首先,UNION 不一定会耗尽数据库;正如所写的那样,在性能方面,它可能根本没有区别,这取决于查询优化器决定如何处理它。
其次,由于您的 where 子句包含“AND”,因此您的所有结果都将匹配描述和名称,所以我认为这不是您想要的。
第三,假设您打算在查询中使用“OR”,您可以尝试以下操作:
select
*
from
images i
where
i.name like '%TEST%'
or i.description like '%TEST%'
order by
case
when i.name like '%TEST%' then 0
else 1
end asc;
Run Code Online (Sandbox Code Playgroud)
你可以CASE
在你的ORDER BY
子句中使用语句来得到你想要的东西。
ORDER BY CASE(WHEN NAME LIKE '%TEST' THEN 1 ELSE 0 END) DESC
Run Code Online (Sandbox Code Playgroud)
编辑:
在 SQL Server 中作为概念证明的示例代码:
DECLARE @t table(id int)
INSERT INTO @t
VALUES
(1),
(2),
(3),
(4),
(5)
SELECT *
FROM @t
ORDER BY(CASE WHEN id > 3 THEN 1 ELSE 0 END) DESC
Run Code Online (Sandbox Code Playgroud)