阅读本文约需要10+分钟
大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈)。上次老师跟大家分享了下SQL函数说明大全(一)的相关知识,今天跟大家分享SQL函数说明大全(二)的知识。
参考来源:https://www.cnblogs.com/moss_tan_jun/archive/2010/08/23/1806861.html
大家国庆玩的怎么样?该调整好心态认真学习啦。言归正传,上次关于SQL函数我们说到了游标函数和变量,这次我们接着上回内容开始
日期函数
这些函数可以操作DateTime与SmallDateTime类型的值。有些函数可用于解析日期值的日期与时间部分,有些函数可用于比较、操纵日期/时间值。日期数据类型的区别如下表所示。
数据类型 | 输出 |
time | 12:35:29. 1234567 |
date | 2007-05-08 |
smalldatetime | 2007-05-08 12:35:00 |
datetime | 2007-05-08 12:35:29.123 |
datetime2 | 2007-05-08 12:35:29. 1234567 |
datetimeoffset | 2007-05-08 12:35:29.1234567 +12:15 |
DATEADD()函数
DATEADD()函数用于在日期/时间值上加上日期单位间隔。比如,要得到2007年4月29日起90天后的日期,可以使用下列语句:
SELECT DATEADD(DAY, 90, '4-29-2007')
结果:2007-07-28 00:00:00.000
可以把下表的值作为时间间隔参数传递给DATEADD()函数。
datepart | 缩写 |
year | yy, yyyy |
quarter | qq, q |
month | mm, m |
dayofyear | dy, y |
day | dd, d |
week | wk, ww |
weekday | dw, w |
hour | hh |
minute | mi, n |
second | ss, s |
millisecond | ms |
microsecond | mcs |
nanosecond | ns |
在下面列出的例子中,我们使用和上一个例子一样的日期,并且在这些例子中还包含了时间数据。每个操作的结果将显示在查询的下一行中。
18年后:
SELECT DATEADD(YEAR, 18, '4-29-1988 10:30 AM')
2006-04-29 10:30:00.000
18年前:
SELECT DATEADD(YY, -18, '4-29-1988 10:30 AM')
1970-04-29 10:30:00.000
9000秒后:
SELECT DATEADD(SECOND, 9000, '4-29-1988 10:30 AM')
1988-04-29 13:00:00.000
9000000毫秒前:
SELECT DATEADD(MS, -9000000, '4-29-1988 10:30 AM')
1988-04-29 08:00:00.000
可以将CONVERT()函数和DATEADD()函数组合在一起,来对1989年9月8日9个月前的日期值进行格式化。
SELECT CONVERT(varchar(20), DATEADD(M, -9, '9-8-1989'), 101)
12/08/1988
这将返回一个可变长度的字符值,比前面例子结果中的默认日期更易容易理解。这是一个函数嵌套调用,DATEADD()函数的返回值(一个DateTime类型的值)被作为值参数传递给CONVERT()函数。
DATEDIFF()函数
DATEADD()和DATEDIFF()函数可以看作一对表兄弟,有点像乘法与除法。在等式的两端有4个元素:起始日期、时间间隔(datepart)、差值和最终日期。如果已知其中的三个值,就可以求出第4个值。
如果在DATEADD()函数中使用起始日期、一个整型值和一个时间间隔,就可返回与起始日期相关的最终日期值。如果提供了起始日期、时间间隔和最终日期,DATEDIFF()函数就可以返回差值。为了说明这一点,我们选择任意两个日期与一个时间间隔作为参数。这个函数将以所提供的时间间隔为单位返回两个日期之间的差值。要知道1989年9月8日和1991年10月17日之间差了几个月,可编写如下查询代码:
SELECT DATEDIFF(MONTH, '9-8-1989', '10-17-1991')
结果是25个月。如果以日期为单位呢?
SELECT DATEDIFF(DAY, '9-8-1989', '10-17-1991')
结果是769天。
1996年7月2日和1997年8月4日之间差几个星期?
SELECT DATEDIFF(WEEK, '7-2-1996', '8-4-1997')
57星期。甚至可以算出自己的年龄是多少秒:
DECLARE @MyBirthDate datetime SET @MyBirthDate = '7-16-1962'SELECT DATEDIFF(SS, @MyBirthDate, GETDATE())
结果显示有些人已经活了15亿秒了!
可以将列名作为参数,把这个函数用在查询中。首先建立一个简单的表,其中包含一些人的姓名和生日:
SELECT c.FirstName ,c.LastName ,e.BirthDate ,DATEDIFF(YEAR, e.BirthDate, GETDATE()) AS ApproximateAgeFROM HumanResources.Employee as e inner join Person.Contact as c on e.ContactID = c.ContactIDorder by c.LastName
下图显示了结果:
初看起来结果是对的,但存在的问题是年龄值没有精确到日。比如,根据表中的数据,Nancy的生日是12月21日,他今年将庆祝第32个生日(这个查询在2010年8月运行)。
如果依据上述计算结果来确定他的年龄何时变化,就应在一月份的某天给他发生日卡片,这比实际日期提前了11个月。
除非用更小的时间单位来计算这些日期的差,否则结果只在雇员实际生日的一年以内是精确的。
以下例子将用差值除以一年(包括闰年)的天数,并将结果值转换为int类型,进行取整运算,而不是四舍五入。
SELECT c.FirstName ,c.LastName ,e.BirthDate ,DATEDIFF(YEAR, e.BirthDate, GETDATE()) AS ApproximateAge ,CONVERT(int, DATEDIFF(DAY, e.BirthDate, GETDATE())/365) AS AgeFROM HumanResources.Employee as e inner join Person.Contact as c on e.ContactID = c.ContactIDorder by c.LastName
比较这次的结果和上一个例子的结果,看看有什么不同。
可以看到,Nancy是31岁,其他雇员的年龄也精确到了天。表中的BirthDate列存储雇员的生日,并以午夜(00:00:00AM)为界,这是一天中的第一秒。GETDATE()函数返回当前的时间与日期。
当前两个日期相差约8小时(写这段文字时是上午8点)。如果希望这个计算更精确,就需要在当前日期的午夜把GETDATE()函数的结果转换为datetime类型。
DATEPART()与DATENAME()函数
这两个函数用于返回datetime或者shortdatetime值的日期部分。DATEPART()函数返回一个整型值;DATENAME()函数返回一个包含描述性文字的字符串。比如,将日期4-29-1988传递给DATEPART()函数,如指定返回月份值,则返回数字4:
SELECT DATEPART(MONTH, '4-29-1988')
而使用相同的参数,DATENAME()函数返回04(这取决于你的机器的本地语言,如果是英文版,那么将返回April):
SELECT DATENAME(MONTH, '4-29-1988')
这两个函数都接收和DATEADD()函数一样的时间间隔参数常量。
GETDATE()与GETUTCDATE()函数
这两个函数都用于返回datetime类型的当前日期与时间。GETUTCDATE()函数使用服务器上的时区设置来求出UTC时间,这和格林威治标准时间或飞行员所说的"祖鲁时"(Zulu Time)是一样的。两个函数都能精确到3.33毫秒。
SELECT GETDATE() SELECT GETUTCDATE()
执行这两个函数,都将返回未经格式化的结果,见下图:
我在北京,和UTC时间相差8个小时,和标准时间相差9个小时。可以使用如下DATEDIFF()函数来验证这个时间差值:
SELECT DATEDIFF(HOUR, GETDATE(), GETUTCDATE())
SYSDATETIME()和SYSUTCDATETIME()函数
这两个SQL Server 2008函数等价于GETDATE()和GETUTCDATE()函数,但不是返回datetime数据类型的结果,而是返回SQL Server 2008新的datetime2数据类型的结果,该数据类型可以精确到100纳秒,当然这取决于服务器安装的硬件。
SELECT SYSDATETIME() SELECT SYSUTCDATETIME()
DAY()、MONTH()和YEAR()函数
这三个函数分别返回以整数表示的datetime或者smalldatetime类型值的日、月、年。它们的用途很广泛,如可以创建独特的个性化日期格式。
假设需要创建一个自定义的日期值作为字符串,通过将这三个函数的输出结果转换成字符类型,然后进行连接操作,就可以对输出结果以任何形式进行组合了:
SELECT 'Year: ' + CONVERT(varchar(4), YEAR(GETDATE())) + ', Month: ' + CONVERT(varchar(2), MONTH(GETDATE())) + ', Day: ' + CONVERT(varchar(2), DAY(GETDATE()))
这个脚本生成下列结果:
Year:2008, Month:2, Day:20
下一节将讨论字符串操纵函数,并使用相似的技术来构建一个紧凑的定制时间戳。
字符串操纵函数
字符串函数可以解析、替换、操纵字符型值。在处理原始字符数据时,最大的挑战之一是如何可靠地提取出有意义的信息。有很多字符串解析函数可用于标识和解析子字符串(一个大字符型值的一部分)。
我们一直在做这种事,在我们阅读文件、发票或者书面材料时,就会本能地标识、分离出有意义的信息片段。这个过程的自动化非常困难,即使是处理不太复杂的文本,也很困难。这些函数包含几乎所有必需的工具,而挑战在于如何找出最简单、最高效的方法。
ASCII()、CHAR()、UNICODE()和NCHAR()函数
这四个函数是相似的,它们都可以在字符和字符的标准数字表示之间转换。美国标准信息交换码(American Standard Code for Information Interchange,ASCII)标准字符集包含128个字母、数字和标点符号。
这个字符集是IBM PC体系结构的基础,虽然有些字符现在看来已经很古老了,但还是被保留了下来,且仍是现代计算机技术的核心。如果在计算机上使用英语,则键盘上的每个字符都是用ASCII码表示的。这对说英语(至少以英语打字)的计算机用户来说是有利的,但是其他人又该怎么办呢?
在计算机的发展过程中, ASCII字符集发布没多长时间便过时了。人们很快将它扩展成为256个字符的ANSI字符集,一个字符用一个字节来保存。
这个扩展的字符列表满足了许多其他用户的需求,可以支持主要的欧洲语言字符,不过仍是美国标准(由美国国家标准学会持有),仍建立在最初的英语字符集的基础上。
为了支持所有可印刷的语言,人们制订了Unicode标准,它支持多种语言特定的字符集。每个Unicode字符需要2个字节的存储空间,是ASCII与ANSI字符的两倍。
但是使用2个字就可以表示超过65 000个不同的字符,完全能够支持东欧和亚洲字符。SQL Server同时支持ASCII与Unicode两种标准。
ASCII()和CHAR()是两个基于ASCII的函数,这两个函数可将计算机上应用的每个字符表示为数字。要确定代表一个字符的数字是什么,就应给ASCII()函数传送只包含一个字符的字符串,如下:
SELECT ASCII('A')
结果是65。
如要将一个已知数字转换为字符,又该怎么办?使用CHAR()函数即可:
SELECT CHAR(65)
结果是字母A。
要得到完整的ASCII字符值列表,可以对一个临时表填充从0到127的数字,然后调用CHAR()函数返回相应的字符。
为了节省空间,我们对以下这个脚本进行了删节,但包含整个结果集,并以多栏格式给出。
-- 创建一个临时表来保存ASCII码: Create Table #ASCIIVals (ASCIIValue smallint) -- 插入数字0 - 127 到临时表中:declare @Number intset @Number = 0while(@Number < 128) begin Insert Into #ASCIIVals (ASCIIValue) Select @Number set @Number = @Number + 1 end-- 查询所有的整型数字与其对应的ASCII码: SELECT ASCIIValue, CHAR(ASCIIValue) AS Character FROM #ASCIIValsdrop table #ASCIIVals
下表是以多栏网格重新格式化的结果集。需要注意的是这里将不可印刷的控制字符以方括号表示。由于许多因素限制,如所安装的字体或语言不同,下表的显示可能会有稍许差异。
UNICODE()函数是ASCII()的Unicode等价函数,NCHAR()函数和CHAR()函数的功能相同,只不过NCHAR()是用于Unicode字符的。
SQL Server的nchar与nvarchar类型能存储任何Unicode字符,可以和这两个函数一起使用。对于特别大的值,ntext类型和nvarchar(max)类型也支持Unicode字符。
要返回扩展字符编码集中的字符,可以将字符编码传递给NCHAR()函数:
SELECT NCHAR(220)
返回字母ü。
SELECT NCHAR(233)
返回带重音符号的小写e:é。
SELECT NCHAR(241)
返回西班牙语的"enya",或者带有发音符号的n:。
当然,ASCII标准也支持所有的欧洲字符,所以使用CHAR()函数也可以返回这些扩展字符。如果对256~65536之间的值使用CHAR()函数,返回值就很有趣了。例如,下面的查询返回希腊字符Ω:
SELECT NCHAR(433)
下面的查询返回西里尔字母Ya(Я)。
SELECT NCHAR(1071)
CHARINDEX()和PATINDEX()函数
CHARINDEX()是原始的SQL函数,用于寻找在一个字符串中某子字符串第一次出现的位置。如函数名所示,这个函数返回一个整型值,表示某子字符串的第一个字符在整个字符串中的位置索引。
以下脚本用于在字符串Washington中寻找子字符串sh的出现位置:
SELECT CHARINDEX('sh', 'Washington')
返回的结果是3,表明s是字符串Washington中的第3个字符。这说明CHARINDEX函数匹配字符的索引是从1开始的。
如果没有匹配到任何结果,函数将返回0。在这个例子中使用两个字符作为子字符串并没有特别意义,但是如果字符串包含多个s字符,就有意义了。
PATINDEX()函数和CHARINDEXO函数类似,它执行相同的操作,但方法稍许不同,该函数增加了对通配符(即Like运算符中使用的字符)的支持。顾名思义,它将返回一个字符模式的索引。
这个函数也可以和ntext、nchar(max)和nvarchar(max)等大字符类型一起使用。注意,如果和这些大字符类型一起使用,PATINDEX()函数将返回bigint类型的值,而不是int类型的值。以下是一个例子:
SELECT PATINDEX('%M_rs%', 'The stars near Mars are far from ours')
注意,如果想找到一个字符串,在所比较的字符串的前后各有0个或者多个字符,则两个百分符都是必须的。下划线表明这个位置上的字符不必匹配,它可以是任意字符。
和使用相同字符串的CHARINDEX()函数作一下比较:
SELECT CHARINDEX('Mars', 'The stars near Mars are far from ours')
这两个函数都返回索引值16。请注意这些函数的执行过程。下一节将把这两个函数和SUBSTRING()函数组合在一起,演示如何使用界定符解析字符串。
LEN()函数
LEN()函数用于返回一个代表字符串长度的整型值。这是一个简单、有用的函数,经常与其他函数一起使用,来应用业务规则。
以下例子将月份和日期转换为字符类型,然后测试它们的长度。如果月份日期只有一个字符,就填充字符0,然后组合成一个8字符的美国格式的日期字符串(MMDDYYYY)。
DECLARE @MonthChar varchar(2), @DayChar varchar(2), @DateOut char(8) SET @MonthChar = CAST(MONTH(GETDATE()) AS varchar(2)) SET @DayChar = CAST(DAY(GETDATE()) AS varchar(2)) -- Make sure month and day are two char long: IF LEN(@MonthChar) = 1 SET @MonthChar = '0' + @MonthChar IF LEN(@DayChar) = 1 SET @DayChar = '0' + @DayChar -- Build date string: SET @DateOut = @MonthChar + @DayChar + CAST(YEAR(GETDATE()) ASchar(4)) SELECT @DateOut AS OutputDate
这个脚本将返回代表日期的8个字符:
08152010
LEFT()和RIGHT()函数
LEFT()与RIGHT()函数是相似的,它们都返回一定长度的子字符串。这两个函数的区别是,它们返回的分别是字符串的不同部分。LEFT()函数返回字符串最左边的字符,顺序从左数到右。
RIGHT()函数正好相反,它从最右边的字符开始,以从右到左的顺序返回特定数量的字符。看一看使用这两个函数返回"GeorgeWashington"这个字符串的子字符串的例子。
如果使用LEFT()函数返回一个5字符的子字符串,则函数先定位最左边的字符,向右数5个字符,然后返回这个子字符串,如下所示。
DECLARE @FullName varchar(25) SET @FullName = 'George Washington'SELECT LEFT(@FullName, 5)
结果为:Georg
如果使用RIGHT()函数返回一个5字符的子字符串,则函数先定位最右边的字符,向左数5个字符,然后返回这个子字符串,如下所示。
DECLARE @FullName varchar(25) SET @FullName = 'George Washington'SELECT RIGHT (@FullName, 5)
结果为:ngton
要想返回字符串中有意义的部分,这两个函数都不是特别有用。如果想返回全名中的姓氏或者名字,该怎么办?这需要多做一点工作。如果能确定每个姓名中空格的位置,就可以使用LEFT()函数在全名中读取名字。
在这种情况下,可以使用CHARINDEX()或者PATINDEX()函数来定位空格,然后使用LEFT()函数返回空格前的字符。下面是第一个用过程方法编写的例子,它将处理过程分解成以下步骤:
DECLARE @FullName varchar(25), @SpaceIndex tinyint SET @FullName = 'George Washington'-- Get index of the delimiting space: SET @SpaceIndex = CHARINDEX(' ' , @FullName) -- Return all characters to the left of the space: SELECT LEFT(@FullName, @SpaceIndex - 1)
结果为:George
如果不想在结果中包含空格,就需要从@SpaceIndex值中减去1,这样结果中就只有名字了。
SUBSTRING()函数
SUBSTRING()函数能够从字符串的一个位置开始,往右数若干字符,返回一个特定长度的子字符串。和LEFT()函数不同之处是,该函数可以指定从哪个位置开始计数,这样就可以在字符串的任何位置摘取子字符串了。
这个函数需要三个参数:要解析的字符串、起始位置索引、要返回的子字符串长度。如果要返回到所输入字符串尾部的所有字符,可以使用比所需长度更大的长度值。SUBSTRING()函数将返回最大可能长度的字符数,而不会将多出的长度以空格填充。
只要指定字符串最左边的字符(1)为起始索引,就可以用SUBSTRING()函数替代LEFT()函数。
继续上一节的例子。可以设置起始位置与长度,返回姓名字符串中间的值。在这个例子中,从位置4开始,返回一个6字符的子字符串"rge Wa"。
DECLARE @FullName varchar(25) SET @FullName = 'George Washington'SELECT SUBSTRING(@FullName, 4, 6)
现在将上述各函数组合在一起,即可从名字+空格+姓氏格式的全名字符串中解析出名字和姓氏。使用先前的逻辑,通过函数嵌套来减少脚本的行数,并去掉@SpaceIndex变量。下面用SUBSTRING()函数替代LEFT()函数:
DECLARE @FullName varchar(25) SET @FullName = 'George Washington'-- Return first name: SELECT SUBSTRING(@FullName, 1, CHARINDEX(' ', @FullName) - 1)
类似的逻辑可以用于解析姓氏,但是必须将起始位置更改为空格后的那个字符。如果空格在第7个位置上,那么姓氏将从第8个位置开始。这就意味着起始位置是CHARINDEX()的返回结果加上1。
DECLARE @FullName varchar(25) SET @FullName = 'George Washington'--Return last name: SELECT SUBSTRING(@FullName, CHARINDEX(' ', @FullName) + 1,LEN(@FullName))
把上述步骤组合在一起,就可以运行下面的查询,从全名变量中提取出名字和姓氏:
DECLARE @FullName varchar(25)SET @FullName = 'George Washington'-- Return first name:SELECT SUBSTRING(@FullName, 1, CHARINDEX(' ',@FullName) - 1) ASFirstName, SUBSTRING(@FullName, CHARINDEX(' ',@FullName) + 1,LEN(@FullName)) AS LastName
结果为:
传递给SUBSTRING()函数的值是空格所在位置加上1,并将该值作为起始位置,这将是姓氏的第1个字母。
由于不可能总是知道名字的长度,所以将LEN()函数的结果作为子字符串长度参数传递进来,当SUBSTRING()函数到达这个位置时,就到达了字符串的末尾,这样就可以将字符串中从空格后面开始的所有字符都包含进来了。
为了举例方便,先创建并填充一个临时表:
CREATE TABLE #MyNames (FullName varchar(50)) GO INSERT INTO #MyNames (FullName) SELECT 'Fred Flintstone'INSERT INTO #MyNames (FullName) SELECT 'Wilma Flintstone'INSERT INTO #MyNames (FullName) SELECT 'Barney Rubble'INSERT INTO #MyNames (FullName) SELECT 'Betty Rubble'INSERT INTO #MyNames (FullName) SELECT 'George Jetson'INSERT INTO #MyNames (FullName) SELECT 'Jane Jetson'go--drop table #MyNames
下面执行一个使用函数调用来解析名字和姓氏值的单行查询表达式。这里对@FullName变量的引用被表中的FullName列所替代:
SELECT SUBSTRING(FullName, 1, CHARINDEX(' ', FullName) - 1) AS FirstName ,SUBSTRING(FullName, CHARINDEX(' ', FullName) + 1, LEN(FullName))AS LastNameFROM #MyNames
在下图所示的结果中,显示了两个不同的列,分别是名字和姓氏。
LOWER()和UPPER()函数
这两个函数很容易理解,它们用于将字符串中所有字符分别都转换为小写和大写,这在比较用户输入或者存储用于比较的字符串时是非常有用的。
字符串比较通常是区分大小写的,这取决于SQL Server安装时的设置。如果和其他的字符串操纵函数一起使用,就可以将字符串转换为合适的大小写,以便存储或显示。
以下例子说明混合大小写的名字,假设名字中的第2个大写子字符串前只包含一个空格,但在特殊情况下也有一些名字是没有空格的。这个例子很容易通过扩展来处理包含其他类型的混合大小写名字(如以MC开头的名字,带连接号的名字等)。
DECLARE @LastName varchar(25), @SpaceIndex tinyint SET @LastName = 'mc donald' -- Test value -- Find space in name: SET @SpaceIndex = CHARINDEX(' ' , @LastName) IF @SpaceIndex > 0 -- Space: Capitalize first & substring SELECT UPPER(LEFT(@LastName, 1)) + LOWER(SUBSTRING(@LastName, 2, @SpaceIndex - 1)) + UPPER(SUBSTRING(@LastName, @SpaceIndex + 1, 1)) + LOWER(SUBSTRING(@LastName, @SpaceIndex + 2, LEN(@LastName))) ELSE -- No space: Cap only first char. SELECT UPPER(LEFT(@LastName, 1)) + LOWER(SUBSTRING(@LastName, 2, LEN(@LastName)))
这个脚本将返回MC Donald。还可以对这个例子进行扩展,以处理姓氏包含撇号的情况。在这个例子的业务规则中,空格是不考虑的。如果找到了撇号,就将后面的字符全部转为大写。
请注意如果要在脚本中测试撇号,就必须输入两次撇号(' '),以表明这是一个文字,而不是一对单引号。姓氏中只存储一个撇号。
DECLARE @LastName varchar(25), @SpaceIndex tinyint, @AposIndex tinyint SET @LastName = 'o''malley' -- Test value -- Find space in name: SET @SpaceIndex = CHARINDEX(' ', @LastName) -- Find literal ' in name: SET @AposIndex = CHARINDEX('''', @LastName) IF @SpaceIndex > 0 -- Space: Capitalize first & substring SELECT UPPER(LEFT(@LastName, 1)) + LOWER(SUBSTRING(@LastName, 2, @SpaceIndex - 1)) + UPPER(SUBSTRING(@LastName, @SpaceIndex + 1, 1)) + LOWER(SUBSTRING(@LastName, @SpaceIndex + 2, LEN(@LastName))) ELSE IF @AposIndex > 0 -- Apostrophe: Cap first & substring SELECT UPPER(LEFT(@LastName, 1)) + LOWER(SUBSTRING(@LastName, 2, @AposIndex - 1)) + UPPER(SUBSTRING(@LastName, @AposIndex + 1, 1)) + LOWER(SUBSTRING(@LastName, @AposIndex + 2, LEN(@LastName))) ELSE -- Nospace: Cap only first char. SELECT UPPER(LEFT(@LastName, 1)) + LOWER(SUBSTRING(@LastName, 2, LEN(@LastName)))
这个脚本返回O'Malley。
LTRIM()和RTRIM()函数
这两个函数分别返回将字符串的左边和右边的空白修剪掉之后的字符串:
DECLARE @Value1 char(10), @Value2 char(10) SET @Value1 = 'One'SET @Value2 = 'Two'SELECT @Value1 + @Value2 SELECT CONVERT(varchar(5), LEN(@Value1 + @Value2))+ ' characters long. 'SELECT RTRIM(@Value1) + RTRIM(@Value2) SELECT CONVERT(varchar(5), LEN(RTRIM(@Value1) + RTRIM(@Value2))) + ' characters long trimmed. '
结果如下:
REPLACE()函数
REPLACE()函数可以把字符串中的某个字符或某个子字符串替换为另一个字符或者子字符串,该函数可以用于全局查找和替换工具中。
DECLARE @Phrase varchar(1000) SET @Phrase = 'I aint gunna use poorgrammar when commenting script and I aint gunna complain about it. ' SELECT REPLACE(@Phrase, 'aint', 'am not')
REPLICATE()和SPACE()函数
在需要将一些字符重复填充进一个字符串时,这两个函数是非常有用的。这里也使用SUBSTRING()例子中的临时表为每个名字填满20个字符,然后将20减去各个字符串的长度,以便将正确的值传递给REPLICATE()函数:
SELECT FullName + REPLICATE('*', 20 - LEN(FullName))FROM #MyNames
结果是每个名字后面都填满了星号,各个名字的总长度都是20个字符:
Fred Flintstorle*****
Wilrna Flintstone****
Barney Rubble*******
Betty Rubble********
George Jetson********
Jane Jetson**********
SPACE()函数与上述函数类似,区别在于该函数使用空格进行填充。它返回一个由空格组成的字符串,空格的个数由参数定义。
SELECT FullName + REPLICATE('*', 20 - LEN(FullName))FROM #MyNames
如果返回"#MyNames表不存在"的错误,只需再次运行本文前面"SUBSTRING()函数"一节的CREATE TABLE脚本即可
。
REVERSE()函数
顾名思义,这个函数用于将字符串中的字符颠倒过来。这在处理连接列表中的单个字符值时将会被用到。
SELECT REVERSE('The stars near Mars are far from ours. ')
结果为:.sruo morf raf era sraM raen srats ehT
STUFF()函数
这个函数可将字符串中的一部分替换为另一个字符串。它本质上是将一个字符串以特定的长度插入另一个字符串中的特定位置上。这对于源值与目的值的长度不一样的字符串替换是很有用的。下列代码用于将字符串中的价格替换为109.95:
Please submit your payment for 99.95 immediately.
价格值是从第32个字符开始的,有5个字符长。在这个位置上插入的子字符串有多长并不重要,只需要知道需要删除多少个字符就可以了。
SELECT STUFF('Please submit your payment for 99.95 immediately. ', 32, 5, '109.95')
结果为:Please submit your payment for 109.95 immediately.
QUOTENAME()函数
这个函数和SQL Server对象名组合使用,以将结果传递给表达式。它只用于给输入的字符串加一对方括号,并返回新形成的字符串。
如果参数包含保留的分隔符或者封装字符(比如引号或括号),这个函数将修改字符串,以便SQL Server能将结果字符串中的这类字符当成文本字符。如下面的例子所示,查询的结果如图所示。
SELECT QUOTENAME(COLUMN_NAME) AS ColumnName FROM INFORMATION_SCHEMA. COLUMN
数学函数
下表中列出的函数用于执行多种普通与特殊的数学运算,可以执行代数、三角、统计、估算与财政运算等运算。
函 数 | 说 明 |
ABS() | 返回一个数的绝对值 |
ACOS() | 计算一个角的反余弦值,以弧度表示 |
ASIN() | 计算一个角的反正弦值,以弧度表示 |
ATAN() | 计算一个角的反正切值,以弧度表示 |
ATN2() | 计算两个值的反正切,以弧度表示 |
CEILING() | 返回大于或等于一个数的最小整数 |
COS() | 计算一个角的正弦值,以弧度表示 |
COT() | 计算一个角的余切值,以弧度表示 |
DEGREES() | 将一个角从弧度转换为角度 |
EXP() | 指数运算 |
FLOOR() | 返回小于或等于一个数的最大整数 |
LOG() | 计算以2为底的自然对数 |
LOG10() | 计算以10为底的自然对数 |
PI() | 返回以浮点数表示的圆周率 |
POWER() | 幂运算 |
RADIANS() | 将一个角从角度转换为弧度 |
RAND() | 返回以随机数算法算出的一个小数, 可以接收一个可选的种子值 |
ROUND() | 对一个小数进行四舍五入运算, 使其具备特定的精度 |
SIGN() | 根据参数是正还是负,返回–1或者1 |
SIN() | 计算一个角的正弦值,以弧度表示 |
SQRT() | 返回一个数的平方根 |
SQUARE() | 返回一个数的平方 |
TAN() | 计算一个角正切的值,以弧度表示 |
元数据函数
这是一些工具函数,它们返回SQL Server配置细节、服务器与数据库设置细节的信息,包括一组用于返回不同对象的属性状态的通用以及专用函数,这些函数把对Master数据库中系统表以及用户数据库的查询封装在函数中。
建议读者使用这些函数以及其他的系统函数,而不是自己创建对系统表的查询,以防今后SQL Server版本对模式进行更改。
今天就分享这么多,关于SQL函数说明大全(二),你学会了多少?欢迎在留言区评论,对于有价值的留言,我们都会一一回复的。如果觉得文章对你有一丢丢帮助,请点右下角【在看】,让更多人看到该文章。 如果有想了解的,也可以进行留言,咱们下节课继续