SQL Server 排序的时候使 null 值排在最后

最近遇到一个 SQL Server 排序的问题,以前也没了解过,然后这次碰到了。

才发现 SQL Server 排序的问题,在指定的排序列中 null 值会默认排在最前面,因为在 SQL Server 中 null 值默认为最小值。

后来问了一下万能的百度,找到了下面一种比较简单的处理方法。

首先建了一个表插入了一些测试数据。

create table UserInfo
(
    UserInfoID    int not null identity(1,1) primary key,
    User_No        int null,
    User_Names        nvarchar(16)  null
)

insert into UserInfo(User_No,User_Names)
select ‘104‘,‘名称三‘ union all
select ‘103‘,‘名称二‘ union all
select ‘108‘,‘名称七‘ union all
select ‘105‘,‘名称四‘ union all
select ‘106‘,‘名称五‘ union all
select ‘102‘,‘名称一‘ union all
select ‘107‘,‘名称六‘ union all
select ‘109‘,‘名称八‘ 

insert into UserInfo(User_Names)
select ‘名称九‘ union all
select ‘名称十‘

select * from UserInfo

下面先直接排序看下效果。

select UserInfoID,User_No,User_Names
from UserInfo
order by User_NO asc 

可以看到指定排序的列,其值为 null 的排在了最前面。

下面就是解决办法。

select UserInfoID,User_No,User_Names
from UserInfo
order by case when User_NO is null then 1 else 0 end asc,User_NO asc 

以上就是解决方法了,既把指定排序列的值为 null 的排在最后了,也可以按照指定的列的值进行排序,是不是很简单。

时间: 2024-10-19 23:48:58

SQL Server 排序的时候使 null 值排在最后的相关文章

SQL Server 排序规则的影响

目录 SQL Server 排序规则 影响 效果演示 更改数据库排序规则 服务器级排序规则 数据库级排序规则 列级排序规则 查询时指定规则 建议 使用 Unicode 数据类型 使用二进制排序规则 [========] SQL Server 排序规则 影响 排序规则会作用到 order.where.group 语句中. 默认中文 Windows 系统中安装的数据库使用的排序规则为:Chinese_PRC_CI_AS 选项 描述 区分大小写 (_CS) 区分大写字母和小写字母. 如果选择此项,排序

Sql Server DateDiff 函数中interval的值

今天在工作中碰到了个问题,统计本周流量时,使用DateDiff函数由于w与week混淆产生统计结果出现错误 参数 interval的设定值如下: 值 缩 写(Sql Server) 说明 Year Yy 年 1753 ~ 9999 Quarter Qq 季 1 ~ 4 Month Mm或m 月1 ~ 12 Day of year Dy或d 一年的日数,一年中的第几日 1-366 Day Dd 日,1-31 Weekday Dw或w 一周的日数,一周中的第几日 1-7 Week Wk 周,一年中的

sql server 获取每一个类别中值最大的一条数据

sql server 获取每一个类别中值最大的一条数据 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 /* 数据如下: name val memo a    2   a2(a的第二个值) a    1   a1--a的第一个值 a    3   a3:a的第三个值 b    1   b1--b的第一个

SQL Server 2008 各种DateTime的取值范围

原文:SQL Server 2008 各种DateTime的取值范围 SQL Server 2008除了DateTime和SmallDateTime之外,又新增了四种时间类型,分别为:date,time,datetime2和datetimeoffset. 各时间类型范围.精度一览表: 数据类型 时间范围 精度 datetime 1753-01-01到9999-12-31 00:00:00 到 23:59:59.997 3.33毫秒 smalldatetime 1900-01-01 到 2079-

Mysql实现null值排在最前或最后

最近在做项目迁移,Oracle版本的迁到Mysql版本,遇到有些oracle的函数,mysql并没有,所以就只好想自定义函数或者找到替换函数的方法进行改造. oracle做数据排序的时候,有时候可以用nulls first或者nulls last将null值排在最前或者最后. oracle方法: null值排在最前 select * from A order by a desc null first null值排在最后 select * from A order by a desc null l

SQL Server 重置Identity标识列的值(INT爆了)(转载)

一.背景 SQL Server数据库中表A中Id字段的定义是:[Id] [int] IDENTITY(1,1),随着数据的不断增长,Id值已经接近2147483647(int的取值范围为:-2 147 483 648 到 2 147 483 647)了,虽然已经对旧数据进行归档,但是这个表需要保留最近的1亿数据,有什么方法解决Id值就快爆的问题呢? 解决上面的问题有两个办法:一个是修改表结构,把Id的int数据类型修改为bigint:第二个是重置Id(Identity标识列)的值,使它重新增长.

SQL SERVER CHAR ( integer_expression )各版本返回值差异的案例

我们都知道CHAR(integer_expression)将ASCII代码转换为字符.当integer_expression介于 0 和 255 之间的整数.如果该整数表达式不在此范围内,将返回 NULL 值.这些都是官方资料介绍的.具体参考https://msdn.microsoft.com/zh-cn/library/ms187323(v=sql.120).aspx 但是在我们最近的一次SQL SERVER 2005 迁移升级到SQL SERVER 2014的过程中发现了一些问题,发现官方文

SQL Server 排序函数 ROW_NUMBER和RANK 用法总结

下面的例子和SQL语句均在SQL Server 2008环境下运行通过,使用SQL Server自带的AdventureWorks数据库. 转载请注明此文原创自 CSDN TJVictor的专栏:http://blog.csdn.net/tjvictor/archive/2009/07/08/4331039.aspx 1.ROW_NUMBER()基本用法: SELECT  SalesOrderID,  CustomerID,  ROW_NUMBER() OVER (ORDER BY SalesO

SQL Server 2012 自动增长列,值跳跃问题

介绍 从 SQL Server 2012 版本开始, 当SQL Server 实例重启之后,表格的自动增长列的值会发生跳跃,而具体的跳跃值的大小是根据增长列的数据类型而定的.如果数据类型是 整型(int),那么跳跃值为 1000:如果数据类型为 长整型(bigint),那么跳跃值为 10000.从我们的项目来看,这种跳跃问题是不能被接受的,尤其是展示在客户端的时候.这个奇怪的问题只在 SQL Server 2012 及更高的版本中存在,SQL Server 2012之前版本不存在此问题. 背景