sql - T-SQL 联合(不同,不是全部)和按优先级排序
问题描述
假设我有一个包含 3 个值的Tag
表 ( Id int
and ):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。
我在这里想念什么?如何在两个语句中使用UNION
with ?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;
推荐阅读
- ruby-on-rails - 有没有办法在 Rails 的单个查询中进行多次插入?
- log4j - log4j 属性文件未在 Eclipse 中更新
- php - Zf3 在 OnBootrstap() Module.php 中获取自定义服务实例 - 获取 ServiceNotFoundException 致命错误
- swift - Swift - API 返回包含不同类型的数组
- python - Python:我的代码做错了什么?
- html - 如何检测水龙头?
- java - 在Java中,我可以让父类实现一个使用子类变量的方法吗?
- three.js - ThreeJS:如果我改变它的位置,网格就会消失
- javascript - 手风琴在我的 HTML 页面中没有按预期工作
- python - 为什么这个积分如此难以近似?