首页 > 解决方案 > T-SQL 联合(不同,不是全部)和按优先级排序

问题描述

假设我有一个包含 3 个值的Tag表 ( Id intand ):Name nvarchar(100)

1 Software
2 Hardware
3 Warehouse

现在我想用关键字查询,并优先考虑以关键字开头的关键字而不是包含关键字的关键字。所以起初我写了这个查询:

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;

但是,这不起作用,因为该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;

但是,这不起作用,因为我收到此错误:

ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP、OFFSET 或 FOR XML。

我在这里想念什么?如何在两个语句中使用UNIONwith ?ORDER BY

标签: sqlsql-servertsqlsql-order-byunion

解决方案


你不需要UNION你可以使用

SELECT *
FROM   Tag T
WHERE  T.Name LIKE '%' + @keyword + '%'
ORDER  BY CASE WHEN T.Name LIKE @keyword + '%' THEN 0 ELSE 1 END,
          Name; 

推荐阅读