SQL Server 指定字段自定义排序的实现

本文介绍两种使用SQL的orderby结合casewhen和charindex实现自定义排序的方法,通过具体示例展示如何按特定顺序排列查询结果,适用于需要精确控制查询结果顺序的场景。

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

本文主要介绍两种用于实现自定义排序的方法,两种方法都是基于order by来实现的。

构建测试销售表sales:

# 创建销售表sales:
create table sales(
year    int,
country varchar(20),
product varchar(32),
profit  int
)
 
# 向销售表sales中插入数据:
insert into sales values(2000,'USA','Calculator',105),
insert into sales values(2000,'USA','Computer',1500),
insert into sales values(2001,'USA','Calculator',50),
insert into sales values(2001,'USA','Computer',2500),
insert into sales values(2001,'USA','Computer',1200),
insert into sales values(2001,'USA','TV',150),
insert into sales values(2001,'USA','TV',100),
insert into sales values(2000,'Finland','Computer',1500),
insert into sales values(2000,'Finland','Phone',100),
insert into sales values(2001,'Finland','Phone',2500),
insert into sales values(2000,'India','Calculator',150),
insert into sales values(2000,'India','Calculator',75),
insert into sales values(2000,'India','Computer',1200)
insert into sales values(2001,'India','Calculator',100);

查询需求:从销售表sales中查询出不同年份下销售产品在各国中的销售情况(包括销售的产品种类和销售利润),并将国家按照Finland,USA,India这种顺序排列。

方法一:利用order by+case when

SQL代码1:

select year,country,product,profit from sales
order by year,case when country='USA' then 1 when country='India' then 2 end

查询结果:

 

 为便于理解SQL代码1中的代码,可以对其稍作修改得到SQL代码2:

select year,country,case when country='USA' then 1 when country='India' then 2 end as
country_number,product,profit from sales
order by year,country_number

我们知道当case when中when后面的条件没有匹配成功时,case when返回的是else后面的值,若else语句也没有,则case when返回NULL。而由上述查询结果我们可以看到利用order by进行排序时,NULL值是排在非NULL值前面的。

方法一:利用order by+charindex

SQL代码3:

select year,country,product,profit from sales
order by year,charindex(country,'Finland,USA,India')

 查询结果:

为便于理解order by+charindex如何实现自定义排序,对SQL代码3稍作修改得到SQL代码4:

select year,country,charindex(country,'Finland,USA,India') as country_number,product,profit from sales 
order by year,country_number

 查询结果:

从上面最近的查询结果我们可以看到,charindex()的计算结果可以当成一个新的字段,而order by +charindex()就等价于 order by +charindex()的返回结果字段。

PS:关于MySQL中的自定义排序可以参考  https://blog.youkuaiyun.com/qq_41080850/article/details/85056595

 

 

### SQL Server字段排序规则 在 SQL Server 中,字段排序规则(collation)决定了字符数据如何比较和排序。这不仅影响字符串的存储方式,还会影响查询性能以及跨数据库操作的一致性。 #### 查看现有字段排序规则 为了查看特定中某个字段排序规则,可以使用如下 T-SQL 查询: ```sql SELECT c.name AS ColumnName, t.name AS TypeName, c.collation_name AS CollationName FROM sys.columns c JOIN sys.types t ON c.system_type_id = t.system_type_id WHERE object_id = OBJECT_ID('YourTableName') AND c.collation_name IS NOT NULL; ``` 此命令会返回给定内所有具有显式定义排序规则的列的信息[^4]。 #### 创带有自定义排序规则的新字段 当创或向已有添加新字段时,可以通过 `CREATE TABLE` 或者 `ALTER TABLE` 命令指定具体的排序规则: ```sql -- 新并设置某列为特定排序规则 CREATE TABLE ExampleTable ( ID INT PRIMARY KEY, Name NVARCHAR(50) COLLATE Latin1_General_CI_AS -- 使用区分大小写的拉丁语通用排序规则 ); -- 修改已存在中的某一列以应用新的排序规则 ALTER TABLE ExistingTable ALTER COLUMN SomeColumn VARCHAR(MAX) COLLATE Chinese_PRC_CS_AS_SC; -- 更改为中文拼音全角半角敏感排序规则 ``` 上述例子展示了两种不同场景下设定排序规则的方法:一种是在新格的同时指定了名称栏位采用不区分大小写的拉丁字母集;另一种则是更改了一个现存里某些文本型态的数据项为更严格的中国普通话拼音顺序,并且保持了对大小写字母的区别对待[^2]。 #### 调整整个数据库级别的默认排序规则 如果希望改变整个数据库内部所有后续新增对象所继承的基础排序属性,则需执行更为复杂的迁移过程。通常情况下议通过备份还原的方式来进行这项工作,因为直接在线调整可能带来兼容性和稳定性方面的问题。具体步骤参见官方文档或其他权威资源获取指导[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值