【SQL Server】1.sql server中的函数总结

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

猜你喜欢

转载自blog.csdn.net/jiemoxiangcha/article/details/78958017