SQL中文排序

SQL中文排序

sql server:select * from [表名]order by [字段],[字段] collate Chinese_PRC_CS_AS_KS_WS

mysql:select * from [表名] ORDER BY CONVERT([字段] USING gbk);

oracle:

  1. 按中文拼音进行排序:SCHINESE_PINYIN_M
    1. SELECT * FROM [表名] ORDER BY NLSSORT(排序字段名,'NLS_SORT = SCHINESE_PINYIN_M');
  2. 按中文部首进行排序:SCHINESE_RADICAL_M
    1. SELECT * FROM [表名] ORDER BY NLSSORT(排序字段名,'NLS_SORT = SCHINESE_STROKE_M');
  3. 按中文笔画进行排序:SCHINESE_STROKE_M
    1. SELECT * FROM [表名] ORDER BY NLSSORT(排序字段名,'NLS_SORT = SCHINESE_RADICAL_M');
<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] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值