设为首页 收藏本站
查看: 1427|回复: 0

[经验分享] 你该知道的-SQL里的这些新语法-函数

[复制链接]

尚未签到

发表于 2017-7-14 13:53:04 | 显示全部楼层 |阅读模式
前言
  最近帮客户做数据库优化的时候发现客户系统使用了很多函数,自己竟然不知道是干啥的,好歹做过好几年开发的我必然不能忍!于是翻了翻资料自己学习了一下随便也分享给群友。
  巧用函数的霸气作用———我做开发的时候就深深的体会到知道一个简单的函数要省去多少代码量,让功能很简单的就能实现。
  注:以下提及的方法执行环境需要SQL2012及以上版本
  --------------博客地址---------------------------------------------------------------------------------------
  原文地址: http://www.cnblogs.com/double-K/
  如有转载请保留原文地址!
  
  废话不多说,直接开整-----------------------------------------------------------------------------------------

NO.1 PARSE 和 TRY_PARSE
  PARSE 函数的功能是把字符串值转换成指定类型,这个记得以前只在写程序的时候用,现在数据库也能用了



1    SELECT PARSE('2016/12/07' AS datetime2 USING 'zh-CN' ) AS Result;   
2   
3    DECLARE @date1 VARCHAR(8);  
4    SET @date1 = CONVERT(VARCHAR(17), GETDATE(), 22);  
5    SELECT PARSE(@date1 AS DATEtime using  'en-GB');  
DSC0000.png

  TRY_PARSE 如果强制转换失败,则返回 Null。 TRY_PARSE 仅用于从字符串转换为日期/时间和数字类型。
  注:默写情况因为你不能把字符串转换为“DATE”数据类型,所以这条“SELECT”语句就会报错。但是 T-SQL 现在支持“TRY_PARSE”函数,顼名思义就是支持我们做转换测试的。
DSC0001.png

  TRY_PARSE 如果强制转换失败,则返回 Null。
DSC0002.png

  另外还有TRY_CONVERTTRY_CAST函数功能都类似。
DSC0003.png

  具体请参见: https://msdn.microsoft.com/zh-cn/library/hh213316.aspx
  https://msdn.microsoft.com/zh-cn/library/hh213126.aspx

NO.2  CHOOSE 函数
  CHOOSE 函数的功能是从两个或多个值的列表中返回一个值,根据指定索引值进行判断。索引值是从“1”计起的整数,也就是该函数的第一个参数。该参数后面跟着就是值列表。
DSC0004.png

  也可以结合业务这样玩
DSC0005.png

  还可以这样玩
DSC0006.png

  具体请参见:https://msdn.microsoft.com/zh-cn/library/hh213019

NO.3 IIF 函数
  IIF 函数支持测试表达式,基于测试结果返回特定值。“IIF”函数有三个参数:有效的布尔表达式,如果表达式为真返回的值和如果表达式为假返回的值。(你可以把“IIF”函数看作是“CASE”诧句的简写版。)
DSC0007.png

  也可以结合业务这样玩
DSC0008.png


NO.4 CONCAT 函数
  CONCAT 采用可变数量的字符串参数,并将它们串联成单个字符串。 它需要至少两个输入值;否则将引发错误。 所有参数都隐式转换为字符串类型,然后串联在一起。 Null 值被隐式转换为空字符串。 如果所有参数都为 Null,则返回 varchar(1) 类型的空字符串。 隐式转换为字符串的过程遵循现有的数据类型转换规则。
  直接使用字符串 “+”拼接



---会返回NULL
declare @a char(10)
set @a = null
select @a + 'a'

---会报错
declare @b int
set @b = 1
select @b + 'a'
  contact可以这么玩(所有参数都隐式转换为字符串类型,这里的int 类型 11)



SELECT CONCAT ( 'Happy ', 'Birthday ', 11, '/', '25' ) AS Result;
  也可以这么玩



SELECT CONCAT(Name, ' (', ProductNumber, ')') AS NewName
FROM Production.Product
WHERE ProductID = 970;
DSC0009.png

  具体请参见:https://msdn.microsoft.com/zh-cn/library/hh231515.aspx

NO.5 DATEFROMPARTS、TIMEFROMPARTS、DATETIMEFROMPARTS 和 DATETIME2FROMPARTS
    略去概念描述,一看就懂  



1 SELECT DATEFROMPARTS(2016, 12, 7);  --年,月,日
2 SELECT TIMEFROMPARTS(23, 4, 18, 53, 3);  --时,分,秒,秒的小数部分,精度
3 SELECT DATETIMEFROMPARTS(2016, 12, 7, 23, 4, 18, 53); --年,月,日,时,分,秒,秒的小数部分,默认3位精度
4 SELECT DATETIME2FROMPARTS(2016, 12, 7, 23, 4, 18, 53, 7); --年,月,日,时,分,秒,秒的小数部分,可指定精度
DSC00010.png


NO.6 EOMONTH 函数
  一个有趣的函数,返回包含指定日期的月份的最后一天(具有可选偏移量)。
DSC00011.png

DSC00012.png

  具体请参见:https://technet.microsoft.com/zh-cn/library/hh213020.aspx

NO.7 LAG 与 LEAD
  访问相同结果集中先前行的数据,而用不使用自联接。 LAG 以当前行之前的给定物理偏移量来提供对行的访问。在 SELECT 语句中使用此分析函数可将当前行中的值与先前行中的值进行比较。
  概念比较模糊上例子一看就知道了



1 WITH test
2 as
3 (
4     select NULL as score
5     UNION ALL
6     select 10
7     UNION ALL
8     select 20
9     UNION ALL
10     select 30
11     UNION ALL
12     select 40
13     UNION ALL
14     select 50
15 )
16 select ROW_NUMBER() over(order by score) as rownum
17 ,score
18 ,LEAD(score) over(order by score) as nextscore1
19 ,LEAD(score,1) over(order by score) as nextscore2
20 ,LEAD(score,1,0) over(order by score) as nextscore3
21 ,LEAD(score,2) over(order by score) as nextscore4
22 ,LAG(score) over(order by score) as previousscore1
23 ,LAG(score,1) over(order by score) as previousscore2
24 ,LAG(score,1,0) over(order by score) as previousscore3
25 ,LAG(score,2) over(order by score) as previousscore4
26 from test

  具体请参见:https://msdn.microsoft.com/zh-cn/library/hh231256.aspx
  https://msdn.microsoft.com/zh-cn/library/hh213125.aspx

NO.8 序列 SEQUENCE
  从 SQL Server 2012 开始,你现在可以定义序列数据库对象了。序列提供了生成一组唯一数字值的机制,可以在整个数据库范围内使用,而不是仅局限于一个表,与“IDENTITY”属性的用法有点类似。尽管你可以使用“IDENTITY”
属性生成在整个数据库中可用的数字值,但那个过程有点麻烦。序列功能使得一切更容易了。
  具体参见:https://msdn.microsoft.com/zh-cn/library/ff878091.aspx
  http://www.cnblogs.com/CareySon/archive/2012/03/12/2391581.html    

NO.9 使用结果集 2012分页方法增强
  2012分页方法增强不仅使得分页变得更容易,也在效率上有了一定的提升。
  具体参见:http://www.cnblogs.com/CareySon/archive/2012/03/09/2387825.html

NO.10 drop table if exists
  在我们写T-SQL要删除某个对象(表、存储过程等)时,一般会习惯先用IF语句判断该对象是否存在,然后DROP,比如:



create table DropIFExists(a int)
--老写法
IF OBJECT_ID('dbo.DropIFExists','U') IS NOT NULL
DROP TABLE DropIFExists  
--或
IF EXISTS (SELECT * FROM sys.objects where name = 'DropIFExists')  
DROP TABLE DropIFExists  
--SQL2016中新增
drop table if exists DropIFExists
DSC00013.png


NO.11 RESULT SETS
  WITH RESULT SETS可以重新定义从存储过程中返回结果的字段名和数据类型。这会使得向拥有特定字段名和数据类型的临时表的结果集中插入记录将变得非常容易,并且不需要依赖存储过程返回了哪些内容。
  WITH RESULT SETS子句同样可以使用在存储过程中,存储过程会返回大量结果集,并且每个结果集都可以自定义各自的字段名和数据类型。



1 CREATE PROCEDURE GetPerson
2 AS
3 BEGIN
4 SELECT TOP 10 BUSINESSENTITYID,CONCAT( FirstName ,' ',MiddleName,' ' , LastName) AS Name
5 FROM [Person].[Person]
6 END
7 GO
8 EXECUTE   GetPerson
9 GO
10 EXECUTE   GetPerson
11 WITH RESULT SETS
12 (
13        (
14        PersonId INT,
15        PersonName VARCHAR(150)
16        )
17 )
18 GO
DSC00014.png

  ----------------------------------------------------------------------------------------------------
  注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错请点击下右下角的推荐,非常感谢!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-393764-1-1.html 上篇帖子: sql注入实例分析 下篇帖子: 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表