你该知道的-SQL里的这些新语法-函数

时间:2022-12-12 10:42:51

前言

  最近帮客户做数据库优化的时候发现客户系统使用了很多函数,自己竟然不知道是干啥的,好歹做过好几年开发的我必然不能忍!于是翻了翻资料自己学习了一下随便也分享给群友。

  巧用函数的霸气作用———我做开发的时候就深深的体会到知道一个简单的函数要省去多少代码量,让功能很简单的就能实现。

  注:以下提及的方法执行环境需要SQL2012及以上版本

--------------博客地址---------------------------------------------------------------------------------------

原文地址: http://www.cnblogs.com/double-K/

如有转载请保留原文地址! 

 

废话不多说,直接开整-----------------------------------------------------------------------------------------

NO.1 PARSE 和 TRY_PARSE

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

  

    SELECT PARSE('2016/12/07' AS datetime2 USING 'zh-CN' ) AS Result;   

    DECLARE @date1 VARCHAR(8);
SET @date1 = CONVERT(VARCHAR(17), GETDATE(), 22);
SELECT PARSE(@date1 AS DATEtime using 'en-GB');

你该知道的-SQL里的这些新语法-函数

  TRY_PARSE 如果强制转换失败,则返回 Null。 TRY_PARSE 仅用于从字符串转换为日期/时间和数字类型。

  注:默写情况因为你不能把字符串转换为“DATE”数据类型,所以这条“SELECT”语句就会报错。但是 T-SQL 现在支持“TRY_PARSE”函数,顼名思义就是支持我们做转换测试的。

  你该知道的-SQL里的这些新语法-函数

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

  你该知道的-SQL里的这些新语法-函数

  另外还有TRY_CONVERT 、TRY_CAST函数功能都类似。

  你该知道的-SQL里的这些新语法-函数

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

         https://msdn.microsoft.com/zh-cn/library/hh213126.aspx

NO.2  CHOOSE 函数

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

  你该知道的-SQL里的这些新语法-函数

  也可以结合业务这样玩

  你该知道的-SQL里的这些新语法-函数

  还可以这样玩

  你该知道的-SQL里的这些新语法-函数

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

NO.3 IIF 函数

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

  你该知道的-SQL里的这些新语法-函数

  也可以结合业务这样玩

  你该知道的-SQL里的这些新语法-函数

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, '/', '' ) AS Result; 

  也可以这么玩

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

你该知道的-SQL里的这些新语法-函数

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

NO.5 DATEFROMPARTS、TIMEFROMPARTS、DATETIMEFROMPARTS 和 DATETIME2FROMPARTS

  略去概念描述,一看就懂  

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

你该知道的-SQL里的这些新语法-函数

NO.6 EOMONTH 函数

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

  你该知道的-SQL里的这些新语法-函数

  你该知道的-SQL里的这些新语法-函数

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

NO.7 LAG 与 LEAD

  访问相同结果集中先前行的数据,而用不使用自联接。 LAG 以当前行之前的给定物理偏移量来提供对行的访问。在 SELECT 语句中使用此分析函数可将当前行中的值与先前行中的值进行比较。

概念比较模糊上例子一看就知道了

 WITH test
as
(
select NULL as score
UNION ALL
select 10
UNION ALL
select 20
UNION ALL
select 30
UNION ALL
select 40
UNION ALL
select 50
)
select ROW_NUMBER() over(order by score) as rownum
,score
,LEAD(score) over(order by score) as nextscore1
,LEAD(score,1) over(order by score) as nextscore2
,LEAD(score,1,0) over(order by score) as nextscore3
,LEAD(score,2) over(order by score) as nextscore4
,LAG(score) over(order by score) as previousscore1
,LAG(score,1) over(order by score) as previousscore2
,LAG(score,1,0) over(order by score) as previousscore3
,LAG(score,2) over(order by score) as previousscore4
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

你该知道的-SQL里的这些新语法-函数

NO.11 RESULT SETS

  WITH RESULT SETS可以重新定义从存储过程中返回结果的字段名和数据类型。这会使得向拥有特定字段名和数据类型的临时表的结果集中插入记录将变得非常容易,并且不需要依赖存储过程返回了哪些内容。

  WITH RESULT SETS子句同样可以使用在存储过程中,存储过程会返回大量结果集,并且每个结果集都可以自定义各自的字段名和数据类型。

 CREATE PROCEDURE GetPerson
AS
BEGIN
SELECT TOP 10 BUSINESSENTITYID,CONCAT( FirstName ,' ',MiddleName,' ' , LastName) AS Name
FROM [Person].[Person]
END
GO
EXECUTE GetPerson
GO
EXECUTE GetPerson
WITH RESULT SETS
(
(
PersonId INT,
PersonName VARCHAR(150)
)
)
GO

你该知道的-SQL里的这些新语法-函数

----------------------------------------------------------------------------------------------------

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

你该知道的-SQL里的这些新语法-函数的更多相关文章

  1. SQL里的concat() 以及group_concat() 函数的使用

    实例参考:https://blog.csdn.net/mary19920410/article/details/76545053 一 concat()函数 1.功能:将多个字符串连接成一个字符串. 2 ...

  2. 将数组里的元素拼接成sql里的in条件

    /** * 将数组里的元素拼接成sql里的in条件,如'a1','a2','a3' * @param array * @returns */function makeSqlInStr(array){ ...

  3. SQL里执行CLR c#代码

    这里只说一个重点: 1.直接在sql里执行clr代码的时候,sql还是会报错 说没有启用 clr 执行以下代码才会起作用 EXEC sp_configure 'clr enabled', 1;  RE ...

  4. sql里的in对应linq的写法 及 IQueryable转化为Dictionary

    string[] arID = { "0001", "0002" }; var dict = this.service.GetMyList(m => ar ...

  5. 将IP表存入SQL里的程序

    将IP表存入SQL里的程序 写得比較粗糙,另一点错误,只是能达到效果.请大家測试  create.asp  ---------------------------------------------- ...

  6. 图解 SQL 里的各种 JOIN

    约定 下文将使用两个数据库表 Table_A 和 Table_B 来进行示例讲解,其结构与数据分别如下: mysql> SELECT * FROM Table_A ORDER BY PK ASC ...

  7. SQL Server 2014 BI新特性(一)五个关键点带你了解Excel下的Data Explorer

    Data Explorer是即将发布的SQL Server 2014里的一个新特性,借助这个特性讲使企业中的自助式的商业智能变得更加的灵活,从而也降低了商业智能的门槛. 此文是在微软商业智能官方博客里 ...

  8. SQL中的5种聚集函数

    作为一个刚毕业进入这行的菜鸟,婶婶的觉的那种大神.大牛到底是怎样炼成的啊,我这小菜鸟感觉这TMD要学的东西这多啊,然后就给自己定了许多许多要学习的东西,可是有人又不停地给你灌输:东西不在多而要精通!我 ...

  9. 动态SQL屏幕条件选择(里面还有赋值的新语法)

    有时候屏幕条件中使用PARAMETERS时候,如果你为空的话,会查不出数据,但是可能你的想法是不想限制而已,但是系统默认理解为了空值,这个时候,如果取判断一下条件是不是空,在SQL里决定写不写的话,会 ...

随机推荐

  1. 阿里的weex框架到底是什么

    title: 阿里的weex框架到底是什么 date: 2016-09-27 10:22:34 tags: vue, weex category: 技术总结 --- weex 工作原理 首先看下官方的 ...

  2. Linux学习三部曲(之三)

    今天用linux的时候,想到在windows客户端上传文件到linux服务端. 下面介绍一种方法. 可以通过SecureCRT上传.下载文件(使用sz与rz命令). 1. 安装 lrzsz 在Secu ...

  3. c#将金额转换为大写,支持小数点,原创经典

    网上搜的都有问题,这个代码属于原创,代码简洁,支持小数点,若没有小数点,则为整 /// <summary> /// 将金额转换成大写 /// </summary> /// &l ...

  4. 【转】android蓝牙开发 蓝牙设备的查找和连接

    1.  首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限 // 管理蓝牙设备的权限 <uses-permissionandroid:name="android. ...

  5. 漫话Unity3D(三)

    八.预制(Prefab) 这个单独提出来,是由于它太经常使用了.也是Unity 的核心要素之中的一个.原本Unity中的一个物体是你拖拽一个模型到场景中,或者创建一个几何体,或者灯光地形等,然后设置这 ...

  6. How to image a CD&sol;DVD ROM and generate hash value

    Someone ask me how to image a CD/DVD ROM and generate hash value in the same time. A small tool call ...

  7. FOFA爬虫大法——API的简单利用

    FOFA是一款网络空间搜索引擎,它通过进行网络空间测绘,帮助研究人员或者企业迅速进行网络资产匹配,例如进行漏洞影响范围分析.应用分布统计.应用流行度等. 何为API?如果你在百度百科上搜索,你会得到如 ...

  8. 一文让你完全弄懂Stegosaurus

    国内关于 Stegosaurus 的介绍少之又少,一般只是单纯的工具使用的讲解之类的,并且本人在学习过程中也是遇到了很多的问题,基于此种情况下写下此文,也是为我逝去的青春时光留个念想吧~ Stegos ...

  9. 容器viewController添加或者删除子viewController

    假设有一个viewControllerA,我们想在viewControllerA中添加viewControllerB,需要执行以下方法: [viewControllerA addChildViewCo ...

  10. webservice系统学习笔记6-使用soap的header传递消息

    1.显示的使用soap的header传递消息(不推荐使用,会破坏正常的代码结构,推荐使用handler处理) @WebResult(name="deleteResult") pub ...