sqlserver使用order by case when进行优先级排序

本文详细介绍了如何使用SQL创建表、插入数据以及执行复杂的排序操作。通过具体示例展示了如何将关键字、标题等字段中包含特定字符的记录进行优先级排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--创建表
create table tNews
(Newsld int identity(1,1) primary key,
Keyword nvarchar(50) not null,
Title nvarchar(100) null,
Contents nvarchar(1000) null,
Remark nvarchar(1000))

--向表中插入数据
insert into tNews(Keyword,Title,Contents,Remark) values ('csd','x','x','a')
insert into tNews(Keyword,Title,Contents,Remark) values ('asd','ax','x','a')
insert into tNews(Keyword,Title,Contents,Remark) values ('cad','x','xa','a')
insert into tNews(Keyword,Title,Contents,Remark) values ('csdn','sdax','x','xy')
insert into tNews(Keyword,Title,Contents,Remark) values ('csdns','sdax','x','xy')
insert into tNews(Keyword,Title,Contents,Remark) values	('all3ns','s3x','3ax','xy')
insert into tNews(Keyword,Title,Contents,Remark) values	('没有','szx','mx','mei')

select * from tNews

--delete from tNews

排序Sql语句:


--关键字含有a的放在最前面的行,标题含有a的放在次于关键字含有a的行...没有含有a的放在最后
--依次排序为:Keyword>Title>Contents>Remark

 select Newsld,Keyword,Title,Contents,Remark from tNews
 order by 
 case when Keyword like '%a%' then 1 else 10 end,
 case when Title like '%a%' then 2 else 10 end,
 case when Contents like '%a%' then 3 else 10 end,
 case when Remark like '%a%' then 4 else 10 end

排序后结果如图:
在这里插入图片描述

<think>嗯,用户想在SQL Server中对包含中英文的字段进行排序,先显示英文再显示中文。我需要根据提供的引用资料来找到解决方法。首先,我记得排序规则(COLLATE)可以影响排序方式。引用[3]里提到可以通过指定排序规则来改变查询结果的顺序,例如使用Latin1_General_BIN区分大小写。但用户需要的是区分中英文,而不仅仅是大小写。 引用[2]中提到,可以通过自定义排序规则来处理中英文混合的情况。例如,判断字段的首字符是否为英文字母,然后根据不同的情况赋予不同的排序值。比如,使用CASE语句,当首字符是英文字母时,排序优先级设为0,否则设为1,然后按这个优先级和字段本身排序。这样英文会排在中文前面。 另外,引用[5]提到使用REPLACE函数去除换行符,可能影响排序结果。所以在处理字段时需要确保数据干净,没有隐藏字符影响判断。 还需要考虑字段开头是否为英文字母,可能需要用ASCII码来判断。例如,ASCII码在65-90和97-122之间的是字母。可以用SUBSTRING和UNICODE函数提取首字符并判断。 综合这些思路,应该可以写出一个SQL查询,先根据首字符是否为英文进行排序,再按字段本身排序。同时,可能需要使用特定的排序规则,如Chinese_PRC_CI_AS来处理中文拼音排序。这样就能实现先英文后中文的效果了。</think>### SQL Server中英文字段排序实现方式(先英文后中文) #### **方法一:使用CASE语句+ASCII码判断** 通过判断字段首字符是否为英文字母(ASCII码范围),赋予不同的排序优先级: ```sql SELECT columnname FROM yourtable ORDER BY CASE WHEN UNICODE(SUBSTRING(columnname,1,1)) BETWEEN 65 AND 90 -- A-Z OR UNICODE(SUBSTRING(columnname,1,1)) BETWEEN 97 AND 122 -- a-z THEN 0 ELSE 1 END, columnname COLLATE Chinese_PRC_CI_AS ``` #### **方法二:自定义排序标记(推荐复杂场景)** 增加辅助列标记语言类型,按标记和字段联合排序: ```sql -- 添加计算列 ALTER TABLE yourtable ADD SortPriority AS CASE WHEN UNICODE(LEFT(columnname,1)) BETWEEN 65 AND 122 THEN 0 ELSE 1 END PERSISTED -- 查询排序 SELECT columnname FROM yourtable ORDER BY SortPriority, columnname COLLATE Latin1_General_CI_AS ``` #### **方法三:COLLATE强制二进制排序** 通过二进制排序规则区分字符类型: ```sql SELECT columnname FROM yourtable ORDER BY CASE WHEN columnname COLLATE Latin1_General_BIN LIKE '[a-zA-Z]%' THEN 0 ELSE 1 END, columnname COLLATE Chinese_PRC_CI_AS ``` #### **关键点说明** 1. **ASCII码范围判断**:英文首字母的ASCII码范围是A-Z(65-90)、a-z(97-122)[^3] 2. **COLLATE选择**:`Chinese_PRC_CI_AS`支持中文拼音排序,`Latin1_General_BIN`提供精确字符识别[^4] 3. **性能优化**:建议为`SortPriority`计算列建立索引[^2] #### **特殊字符处理** 若字段包含空格/换行符,需先清理数据: ```sql REPLACE(REPLACE(columnname, CHAR(13), ''), CHAR(10), '') -- 去除换行符[^5] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值