在这个示例中,LastName列为Samant的Title列的值是NULL值。ISNULL函数在查询结果中把NULL值替换为UNKNOWN字符串表达式。
8.4.2 使用ISNULL进行灵活的搜索
在这个技巧中,我会演示如何在变量可能有或没有填充的情况下在查
询中进行灵活、动态的搜索。这个技巧声明了3个局部搜索变量ProductID、StartDate和StandardCost。通过使用这个技术,你的查询可以根据所有、一些或者0个参数来返回结果。在这个示例中,只指定了ProductID:
只使用了@ProductID
用于搜索的局部变量
这个查询返回:
在第二个示例中,通过最小和最大的StandardCost范围来进行搜索:
用于搜索的局部变量
这个查询返回下面的(部分)结果:
解析
本技巧中演示的方法的优势在于代码很灵活,允许我们以无数种方式
搜索数据,并且能让每个搜索条件为可选的。这个技巧的关键在于WHERE子句。每一个搜索条件都使用ISNULL和局部变量名,后面跟列名本身:
如果参数没有设置,它就会是NULL,因此每列的搜索条件会对列本身的值进行运算——总是返回TRUE。只有指定的参数才会用来过滤结果。
8.4.3 返回表达式列表中第一个非NULL值
COALESCE函数返回提供的表达式列表中第一个非NULL值。语法是:
这个技巧演示了如何使用COALESCE来返回第一个出现的非NULL值:
这个查询返回:
解析
在这个技巧中,我们创建了3个局部变量:@Value1、@Value2和@Value3。只有@Value2和@Value3被设置为整数值。没有设置值的变量@Value1是NULL。
在COALESCE中,从@Value1到@Value3一次检查3个值。由于@Value2变量是第一个非NULL值的变量,所以返回了“22”。
8.4.4 当两个表达式相等的时候返回NULL值,否则返回第一个表达式
当提供的两个表达式有相同值的时候NULLIF返回NULL值,否则返回第一个表达式。
本例演示了如何使用NULLIF来运算两个表达式。如果两个表达式相等,NULL值会被返回,否则会返回第一个运算的表达式:
这个查询返回:
下面的示例测试两个表达式相等时返回的值:
这个查询返回:
解析
在这个技巧中,开始的批处理有两个不同的值:55和955。由于@Value1先运算并且两个值不同,因此NULLIF条件是FALSE,并返回了先运算的值。在第二个批处理中,@Value1和@Value2相等,所以NULLIF返回了NULL值。
8.5 日期函数
在本书的开始我们已经提到过,SQL Server 2005有两种数据类型来存储日期和时间数据:datetime和smalldatetime。datetime数据类型保存介于1753
年1月1日和9999年12月31日之间的数据,测量时间最高达到3.33毫秒。smalldatetime数据类型保存更小的日期范围,从1900年1月1日到2079年6月6日,时间精度为1分钟。SQL Server 2005提供了一些使用这些数据类型操作的函数,如表8-5。
表8-5 日期函数
函 数 名 DATEADD DATEDIFF DATENAME DATEPART DAY、MONTH和YEAR
描 述
DATEADD根据指定的间隔和数字返回一个增加或减少后
的新日期
DATEDIFF从第二个日期减去第一个日期并生成一个指定的datepart码格式的值
DATENAME返回datepart码指定的一部分日期的字符串值
这个函数返回datepart码指定的一部分日期的整数值 DAY返回表示日的整数值,MONTH返回表示月的整数而YEAR返回表示计算日期的年的整数
GETDATE、GETDATE和CURRENT_TIMESTAMP都返回当前的日期和时GETUTCDATE和间。GETUTCDATE返回格林尼治平时(协调世界时) CURRENT_TIMESTAMP
下面的一些技巧会演示这些日期函数。
8.5.1 返回当前日期和时间
GETDATE和CURRENT_TIMESTAMP都返回当前的日期和时间。GETUTCDATE返回格林尼治平时(协调世界时)。
这个示例演示如何返回当前的日期和时间以及协调世界时(格林尼治平时):
协调世界时或格林尼治平时
当前日期和时间
当前日期和时间
这个查询返回:
解析
这个技巧演示了获取当前日期和时间的3种方法。这3个函数都能在表的列定义中用作日期数据类型的DEFAULT值。
8.5.2 增加或减少日期值
DATEADD返回已经增加或减少的另外一个日期表达式的结果。语法是:
datepart部分用于指定要修改的时间或日期的单位,如表8-6描述的那样: 表8-6 depart代码 代 码 yy或者yyyy qq或q mm或m dy或y dd或d wk或ww dw或w hh mi或n ss或s ms
描 述 年 季度 月 年中第几天 天 周 星期几 小时 分钟 秒 毫秒
DATEADD函数的第二个参数是要增加或减少日期的数字值(正数或负数)。第三个参数是要修改的日期。
第一个示例根据年减少日期:
这个查询返回:
下面的示例根据季度增加日期: