SQL Server中的函数总结:
目录:
一、字符串函数
1.len和datalength
2.substring
3.trim
4.len
5.lower
6.ascii
7.right
二、SQL Server Date 函数
三、Merge Into
四、CASE
一、字符串函数
--1.SQL Server中Len和DataLength的区别
--(1)、SQL Server中Len() --返回指定字符串表达式的字符(而不是字节)数,其中不包含尾随空格。
--(2)、SQL Server中DataLength() --返回用于表示任何表达式的字节数
--(3)、通过实例说明SQL Server中Len和DataLength的区别
--实例1、相同,返回结果都为5
select LEN ('sssss') ---5
select DATALENGTH('sssss') ---5
--实例2、不相同,DATALENGTH是LEN的两倍,因为每个使用Unicode字符集的字符都要占用2个字节
select LEN(N'sssss') ---5
select DATALENGTH(N'sssss') ---10
--实例3、不相同,DATALENGTH是LEN的两倍多,由于LEN计算时不包含尾空格
select LEN(N'sssss ') ---5
select DATALENGTH(N'sssss ') ---14
--实例4、不相同,DATALENGTH是LEN的两倍,由于LEN计算时不包含尾空格,但包含头部空格
select LEN(N' sssss') ---6
select DATALENGTH(N' sssss') ---12
--2.【SUBSTRING ( expression ,start , length ) 】--substring函数:返回字符串的一部分
--3.【trim 函数:去除数据中的空格。 rtrim代表去除右边的空格,ltrim代表去除左边的空格。】
LTrim、RTrim 和 Trim 函数的区别
返回不带前导空格 (LTrim)、后续空格 (RTrim) 或前导与后续空格 (Trim) 的字符串副本。
LTrim(string)
RTrim(string)
Trim(string)
--4.【LEN ( string_expression) 返回类型:bigint 或int。注:LEN 不包括尾随空格。】--len 函数:返回指定字符串表达式的字符数,其中不包含尾随空格。
--5.【LOWER(character_expression)、UPPER(character_expression)】 --lower(@strRet) 转为小写字母 --把小写字母转为大写字母可以用upper函数
-- 6.【ASCII ( character_expression ) 返回类型: int】ascii函数:返回字符表达式中最左侧的字符的 ASCII 代码值。
--7.right(给字符串补0)
--第一种方法
SELECT RIGHT(CAST('00000000'+RTRIM(' 1110 ') AS VARCHAR(50)),8) --先去后续空格,再左边补0 ,8位数补零
SELECT RIGHT('00000'+CAST([FieldName] AS nvarchar(50)),5) FROM db.TableName --左边补0,如 00001,00039
SELECT LEFT(CAST([FieldName] AS nvarchar(50))+'00000',5) FROM db.TableName --右边补0,如 10000,39000
--第二种方法
SELECT REPLICATE('0',5-len('39'))+'39' --左边补0, 如 00039
SELECT '39' + REPLICATE('0',5-len('39')) --右边补0,如 39000
扩展:Oracle:
--RPAD 在列的右边粘贴字符
--LPAD 在列的左边粘贴字符
select
LPAD(1,4,'0') str ,
LPAD(12,4,'0') str ,
LPAD(123,4,'0') str
from dual
二、SQL Server Date 函数
--分析
--1)
--DATEADD() 函数在日期中添加或减去指定的时间间隔。
--DATEADD(datepart,number,date)
--2)
--DATEDIFF() 函数返回两个日期之间的时间。
--DATEDIFF(datepart,startdate,enddate)
--计算月份差
SELECT DATEDIFF(MONTH,'2018-02-20','2018-06-06') AS DiffDate
--示例:
--获取年月
select CONVERT(varchar(6),getdate(),112) --201803
select CONVERT(varchar(7),getdate(),120) --2018-03
--取前一个月的时间
SELECT DATEADD(MONTH,-1,GETDATE()) --2018-02-04 13:50:37.617
--获取下一个月的天数
SELECT DAY(DATEADD(MONTH,1,(CONVERT(VARCHAR(6),DATEADD(MONTH,1,GETDATE()),112))+ '01')-1)
--SELECT DATEADD(MONTH,1,(CONVERT(VARCHAR(6),DATEADD(MONTH,1,GETDATE()),112))+ '01')-1
--SELECT DATEADD(MONTH,1,(CONVERT(VARCHAR(6),DATEADD(MONTH,1,GETDATE()),112))+ '01')
--SELECT (CONVERT(VARCHAR(6),DATEADD(MONTH,1,GETDATE()),112))+ '01'
三、Merge Into 用法
--Merge Into 用法
--从一个数据库的一张表同步数据到另外一个数据库的一张表,同步的数据不是insert就是update。
--一般做法是先判断当前数据在另外一张表存不存在,存在则更新,不存在则插入。需要一次查询判断:exist或count(*)>0,
--然而用Merge Into 更为简洁:
CREATE PROC [dbo].[XXX_SynchroMaterial]
@userID nvarchar(50)
as
begin
declare @nResult int; --同步多少条物料
declare @totalRows int;
set @nResult=0;
--建立临时数据表
create table #tmpMateriel
(
[id] int IDENTITY(1,1) ,
MaterielGUID nvarchar(50),
MaterielCode nvarchar(50),
MaterielName nvarchar(255),
ParentNode nvarchar(50),
IfLeafNode bit,
Material_Category int null,
Raw_Material_Category int null
)
--读取物料中间表数据,插入到临时表
insert into #tmpMateriel(MaterielGUID,MaterielCode,MaterielName,ParentNode,IfLeafNode,Material_Category,Raw_Material_Category)
SELECT [MaterielGUID]
,[MaterielCode]
,[MaterielName]
,[ParentNode]
,[IfLeafNode]
,CASE WHEN (MaterielCode like '1.03%' or MaterielCode like '2.02%') THEN 1
WHEN (MaterielCode like '1.04%' or MaterielCode like '2.03%') THEN 2
ELSE 3
END
,CASE WHEN [IfLeafNode]=1 THEN 4 --小料
ELSE null
END
FROM [ChwareXXXInterface].[dbo].[Tab_Materiel_Interface] where [If_Read]=0;
select @nResult=COUNT(*) from #tmpMateriel;
Merge Into [ChwareXXX].[dbo].[Tab_Material] t
USING (select [MaterielCode],[MaterielName],[ParentNode],[IfLeafNode],[Material_Category],[Raw_Material_Category] from #tmpMateriel)as s
on t.[MaterialCode]=s.[MaterielCode]
When Matched Then Update set t.[MaterialName]=s.[MaterielName],
t.[ParentNode]=s.[ParentNode],
t.[IfLeafNode]=s.[IfLeafNode],
t.[Material_Category]=s.[Material_Category],
t.[Raw_Material_Category]=s.[Raw_Material_Category],
t.[ModifyUser]=@userID,
t.[ModifyDT]=getdate()
When Not Matched Then Insert ([MaterialCode],[MaterialName],[ParentNode],[IfLeafNode],[Material_Category],[Raw_Material_Category],[CreateUser],[CreateDt])
values (s.[MaterielCode],s.[MaterielName],s.[ParentNode],s.[IfLeafNode],s.[Material_Category],s.[Raw_Material_Category],@userID,getdate());
--更新接口表读取状态
update [ChwareXXXInterface].[dbo].[Tab_Materiel_Interface] set [If_Read]=1,ReadDT=GETDATE()where MaterielCode in (select MaterielCode from #tmpMateriel);
--删除临时表
drop table #tmpMateriel;
select @nResult; --同步成功多少条数据
end
GO
--总结:
-- 通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,
--连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。
--这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。
--语法:
--MERGE [INTO [schema .] table [t_alias]
--USING [schema .] { table | view | subquery } [t_alias]
--ON ( condition )
--WHEN MATCHED THEN merge_update_clause
--WHEN NOT MATCHED THEN merge_insert_clause;
四、CASE
--CASE WHEN的两种格式
--CASE WHEN的两种格式
--1.简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--2.Case搜索函数
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END