Luk*_* Vo 1 sql t-sql sql-server union sql-order-by
假设我有一个包含3个值的Tag表(Id int和Name nvarchar(100)):
1 Software
2 Hardware
3 Warehouse
Run Code Online (Sandbox Code Playgroud)
现在我想查询关键字,并优先考虑以关键字开头的那些关键字.所以一开始我写这个查询:
SELECT 0 AS SortCol, *
FROM Tag T
WHERE CHARINDEX(@keyword, T.Name) = 1
UNION
SELECT 1 AS SortCol, *
FROM Tag T
WHERE T.Name LIKE ('%' + @keyword + '%')
ORDER BY SortCol, Name;
Run Code Online (Sandbox Code Playgroud)
但是这不起作用,因为SortCol列不再使它们不同(Warehouse值出现两次,因为它在两者中都是正确的).
那时我想我需要DISTINCT通过删除该列来手动调用:
SELECT DISTINCT T2.Id, T2.Name
FROM
(SELECT 0 AS SortCol, *
FROM Tag T
WHERE CHARINDEX(@keyword, T.Name) = 1
UNION
SELECT 1 AS SortCol, *
FROM Tag T
WHERE T.Name LIKE ('%' + @keyword + '%')
ORDER BY SortCol, T.Name) AS T2;
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,因为我收到此错误:
除非还指定了TOP,OFFSET或FOR XML,否则ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效.
我在这里错过了什么?如何我可以用UNION用ORDER BY在这两个语句?
你不需要UNION你可以使用
SELECT *
FROM Tag T
WHERE T.Name LIKE '%' + @keyword + '%'
ORDER BY CASE WHEN T.Name LIKE @keyword + '%' THEN 0 ELSE 1 END,
Name;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
62 次 |
| 最近记录: |