函数
系统函数:聚合函数,数值函数,日期和时间函数,字符串函数,转换函数
自定义函数:标量值函数(返回具体值),表值函数(返回一个结果集)
函数名 |
描述 |
举例 |
CHARINDEX |
用来寻找一个指定的字符串在另一个字符串中的起始位置
|
ELECT CHARINDEX(‘SQL','My SQL Course',1 )
|
LEN
|
返回传递给它的字符串长度
|
SELECT LEN('SQL Server课程')
|
LOWER
|
把传递给它的字符串转换为小 |
SELECT LOWER('SQL Server课 |
UPPER
|
把传递给它的字符串转换为大 |
SELECT UPPER('sql server课程' |
LTRIM
|
清除字符左边的空格
|
SELECT LTRIM (' 周智宇 ') 返回:周智宇 (后面的空格保 |
RTRIM
|
清除字符右边的空格
|
SELECT RTRIM (' 周智宇 |
RIGHT(LE |
从字符串右边(左边)返回指定 |
SELECT RIGHT('买卖提.吐尔松',3) 返回:吐尔松
|
REPLACE
|
替换一个字符串中的字符
|
SELECT REPLACE('莫乐可切.杨可','可','兰')
|
函数名 |
描述 |
举例 |
GETDATE
|
取得当前的系统日期
|
SELECT GETDATE() 返回:今天的日期
|
DATEADD
|
将指定的数值添加到指定的日期部分后的日期
|
SELECT DATEADD(mm,4,’01/01/99’) 返回:以当前的日期格式返回05/01/99
|
DATEDIFF
|
两个日期之间的指定日期部分的区别 |
SELECT DATEDIFF(mm,’01/01/99’,’05/01/99’) 返回:4
|
DATENAME
|
日期中指定日期部分的字符串形式
|
SELECT DATENAME(dw,’01/01/2000’) 返回:Saturday
|
DATEPART
|
日期中指定日期部分的整数形式
|
SELECT DATEPART(day, ’01/15/2000’) 返回:15
|
YEAR/MONTH/DAY
|
日期中指定年、月、日部分
|
SELECT YEAR(GETDATE()) 返回:2008
|
函数名 |
描述 |
举例 |
ABS
|
取数值表达式的绝对值
|
SELECT ABS(-43) 返回:43
|
CEILING
|
返回大于或等于所给数字表达式的最小整数
|
SELECT CEILING(43.5) 返回:44
|
FLOOR
|
取小于或等于指定表达式的最大整数
|
SELECT FLOOR(43.5) 返回:43
|
POWER
|
取数值表达式的幂值
|
SELECT POWER(5,2) 返回:25
|
ROUND
|
将数值表达式四舍五入为指定精度
|
SELECT ROUND(43.543,1) 返回:43.5
|
Sign
|
对于正数返回+1,对于负数返回-1,对于0 则返回0
|
SELECT SIGN(-43) 返回:-1
|
Sqrt
|
取浮点表达式的平方根
|
SELECT SQRT(9) 返回:3
|
函数名 |
描述 |
举例 |
CONVERT/CAST |
用来转变数据类型
|
SELECT CONVERT (VARCHAR (5),12345) 返回:字符串12345
|
DATALENGTH
|
返回用于指定表达式的字节数
|
SELECT DATALENGTH (‘我爱中国') 返回:8
|
Create function 函数名(参数)
returns 返回值数据类型
[with {Encryption | Schemabinding }]
[as]
begin
SQL语句(必须有return 变量或值)
End
Create Function F_sum1(@a int, @b int)
Returns int --返回值类型(int)
As
Begin
Return @a+@b --返回和,是具体的值
End
set @s = dbo.F_sum1(100,50) --传入参数100、50,标量值函数的返回值需变量来接收
--调用函数必须要带dbo.否则视为系统函数
print @s
create function 函数名(参数)
returns table
[with {Encryption | Schemabinding }]
as
return(一条SQL语句)
create function F_name(@a int, @b varchar(33)) --参数定义时带长度
returns varchar(50) --返回值类型时带长度
as
begin
return convert(varchar,@a)+@b --转换时可不带长度
end
declare @c varchar(50) --声明时要带长度
set @c=dbo.f_name(100000,'明天')
print @c
(1).内联表值函数不用写begin...end
(2).内联表值函数返回的是一张表(结果集)
(3).内联表值函数的调用,就如同调一张表一样,归根结底,是对结果集的操作
用表名,只是将结果集套了一个名字
create function 函数名(参数)
returns 表格变量名 table (表格变量定义)
[with {Encryption | Schemabinding }]
as
begin
SQL语句
End
create function FUNC_UserTab_2(@myId int)
returns @t table(
[ID] [int] NOT NULL,
[Oid] [int] NOT NULL,
[Login] [nvarchar](50) NOT NULL,
[Rtx] [nvarchar](4) NOT NULL,
[Name] [nvarchar](5) NOT NULL,
[Password] [nvarchar](max) NULL,
[State] [nvarchar](8) NOT NULL
)
as
begin
insert into @t
select * from ST_User where ID<@myId
return
end
(1). 可以返回表变量
(2). 限制颇多,包括
不能使用output参数;
不能用临时表;
函数内部的操作不能影响到外部环境;
不能通过select返回结果集;
不能update,delete,数据库表;
(3). 必须return 一个标量值或表变量
多句表格值函数包含多条SQL语句,至少有一条在表格变量中填上数据值
表格变量格式
returns @变量名 table (column 定义| 约束定义 [,…])
对表格变量中的行可执行select,insert,update,delete , 但select into 和 insert 语句的结果集是从存储过程插入。
CREATE function Get_StrArrayStrOfIndex
(
@str varchar(1024), --要分割的字符串
@split varchar(10), --分隔符号
@index int --取第几个元素
)
returns varchar(1024)
as
begin
declare @location int
declare @start int
declare @next int
declare @seed int
set @str=ltrim(rtrim(@str))
set @start=1
set @next=1
set @seed=len(@split)
set @location=charindex(@split,@str)
while @location<>0 and @index>@next
begin
set @start=@location+@seed
set @location=charindex(@split,@str,@start)
set @next=@next+1
end
if @location =0 select @location =len(@str)+1
--这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。
return substring(@str,@start,@location-@start)
end
--调用示例:select dbo.Get_StrArrayStrOfIndex('8,9,4',',',2)
13-1,13-2,13-3,13-10,13-100,13-108,13-10,13-100,13-109、13-18,13-11,13-15,14-1,14-22,14-1要求对其进行有序排序:
分析:
首先要搞清楚这是字符串;
1.先对“-”前面的进行排序
2.再对“-”后面的进行排序
问题:怎么取出“-”前面的和后面的?
解决:
使用到两个函数:
substring('ab-cd',4,2)
--字符串取值,从字符串第4位开始取,取2个
--返回值cd
charindex('-','ab-cd',1)
--从“ab-cd”字符串的第1位开始,查找“-”出现的位置角标
--返回值3
部分代码:
--取“-”前的
select tbid,substring(tbid,1,charindex('-',tbid,1)-1),charindex('-',tbid,1) from tb_myname
--取“-”后的
select tbid,substring(tbid,charindex('-',tbid,1)+1,len(tbid)-charindex('-',tbid,1)) from tb_myname
--合并在一起
select tbid,substring(tbid,1,charindex('-',tbid,1)-1),substring(tbid,charindex('-',tbid,1)+1,len(tbid)-charindex('-',tbid,1)) from tb_myname
3.已将“-”前后都取出,后面只需对这两个列进行排序即可
select tbid from tb_myname
order by substring(tbid,1,charindex('-',tbid,1)-1),
substring(tbid,charindex('-',tbid,1)+1,len(tbid))
--注意:看得到的结果集是不是正确的结果?仔细看,不是
--出来的结果是按字符串排序的,而我们的要求是要按“-”前后数值的大小进行排序,因此要将取出来的前后字符串转换成int类型的,然后再排序。
select tbid from tb_myname
order by cast(substring(tbid,1,charindex('-',tbid,1)-1) as int),
cast(substring(tbid,charindex('-',tbid,1)+1,len(tbid)) as int)
编写一个函数,要求能将阿拉伯数字(1,2,3,4,5,6,7,8,9,0)分别替换为(a,b,c,d,e,f,g,h,i,j),非数字全部替换为y,禁止使用replace
--比如,创建个函数,往里面传值'12345',结果返回'abcde'。
分析:
输入“12345”,返回“abcde”,显然是要将输入的“12345”一个个截取出来,然后用replace去做替换,然后再拼成一个字符串返回。
但题目要求不能用replace。
思路:
(1)将传入的字符串一个个截用substring();
(2)一个个替换,用case when '1' then 'a'……
代码:
create function f_my(@sid varchar(66))
returns varchar(66)
as
begin
declare @i int,@t varchar(6),@newstr varchar(66)
set @i=1
set @newstr=''
while(@i<=len(@sid))
begin
--依次载取一个字符
set @t=substring(@sid,@i,1)
set @t=case @t when '1' then 'a'
when '2' then 'b'
……
else 'y'
end
set @newstr=@newstr+@t
set @i=@i+1
end
return @newstr
end
调用:
select dbo.f_my('123456')
要求建立多语句表值函数,能将传入的字符串(如‘123456’),生成1列6行记录
分析:将传入的‘123456’分别载取出来做为一条记录存入(select into ...)一个新表的列中。
sid
insert into a
select '2'
思路:java中有split()分割方法,sql中没有,自建一个分割函数。
代码:
create function f_names(@str varchar(20))
returns @tba table(sa varchar(5))
as
begin
declare @i int
set @i=1
while(@i<=len(@str))
begin
insert into @tba select substring(@str,@i,1)
set @i=@i+1
end
return
end
调用:
select * from dbo.f_names('abcdef')
要求编写函数,要求能将传进来的字符串反序输出,比如'abcdef',要求输出为'fedcba'
如果大家想浏览我的下一篇文章,请留言
如果觉得我的文章写的好的,请点个赞,或者加关注
版权声明:此文章属于原创,不准随意转载:https://blog.csdn.net/LYQ2332826438