SqlServer常用內置函數

--=======================================
-- SQL常用內置函數
--=======================================

--判斷爲null函數
declare @abc varchar(5)
set @abc='mnw'
select isnull(@abc,0);  --如果變量abc值爲null,則取0,否則取被賦的值


--查找索引函數
select charindex('abc','bac abc fmd abc'); --獲取字符串abc在長字符串bac abc fmd abc中的索引位置,索引默認從1開始找
select charindex('abc','bac abc fmd abc',9); --索引從9開始找


--重複獲取函數
select replicate('m',3); --按指定次數重複字符表達式,將m字符重複三次
select replicate('abc',2);--將字符串abc重複2次


--大小寫轉換函數
select len('datazsrt'); --獲取字符串長度
select lower('ADRTddd'); --轉小寫
select upper('data');--轉大寫

--SQL GUID去除橫線,並轉換爲小寫
 LOWER(REPLACE(LTRIM(NEWID()),'-',''))

--替換截取函數
select substring('abcdef111',2,3); --截取字符串

select replace('dadt123','t1','AA'); --替換字符串

--類型轉換函數
select cast('2015-08-02' as datetime) as 日期類型; --數據類型轉換,CAST是ANSI兼容的,而CONVERT則不是

select 'ab'+cast(1 as varchar);-- 將1轉化爲字符串與ab相加

select convert(datetime,'2015-08-02'); --數據類型轉換,與cast相同

select convert(varchar(19),getdate(),113); --不同的是convert還提供一些特別的日期格式轉換,而cast沒有這個功能

select format(getdate(),'yyyy/mm/dd'); --將日期轉化爲規定的格式

   
   
--數學函數    
select round(2.15,1); --四捨五入,第二個參數索引從0開始,即:0表示小數後第一位進行判斷

select ceiling(2.158); --向上取整

select floor(2.713); --向下取整

--日期函數
select getdate();

select datepart(mm,'2015-08-04 15:28:26');  --返回日期的某一部分  yy,mm,dd,hh,mi,ss,

select dateadd(dd,-25,'2015-08-04 15:28:26'); --在日期中加上或減去制定的時間間隔,給天數減25天

select datediff(day,'2008-06-05','2008-08-05') as 天數; --返回兩個日期之間的天數

--聚合函數
count(),min(),max(),avg(),sum()

--4個排名函數,都可以與over()結合使用
row_number(),rank(),dense_rank(),ntile()

select row_number() over(order by column_name),* from table_name; --按某個字段排名然後查詢出所有值,它會爲查詢出來的每一行記錄生成一個序號,依次排序且不會重複
select row_number() over(order by column_name),* from table_name order by column_name desc; --先按某個字段排名給出序號,然後再根據另一個字段進行倒敘排列,排出序號可能會被打亂


select rank() over(order by column_name),* from table_name; --rank函數會考慮到column_name中的值會重複或相同,那個給出的序號也會相同。但生成的序號不是連續的,rank是跳躍排序

select dense_rank() over(order by column_name),* from table_name; --dense_rank函數不同與rank函數,它生成的序號是連續的,dense_rank不會跳躍


--ntile()函數還是比較麻煩的排序分組函數

select ntile(4) over(order by column_name des),* from table_name;  --先對column_name進行倒序排列, 參數4表示分爲4組,每組中有多少個相同的序號要根據(總記錄數/總組數)+1 條

--如果一個表中有6條數據,那麼(6/4)+1=2;每組中有兩個相同的記錄數,末尾的根據情況分配,必須要分4組。但如果是8條數據,能整除,8/4=2;就不需要再加1,每組中平均分兩條相同記錄數的數據

IIf 
返回由邏輯測試確定的兩個數值或字符串值之一。

語法 
數字 
IIf(Logical EXPression, Numeric Expression1, Numeric Expression2)

如果 Logical Expression 取值爲 TRUE,則此函數返回 Numeric Expression1,否則,返回 Numeric Expression2。

字符串 
IIf(Logical Expression, String Expression1, String Expression2)

如果 Logical Expression 取值爲 TRUE,則此函數返回 String Expression1,否則,返回 String Expression2。

註釋 
只有當 Logical Expression 的值爲零時,才認爲該表達式是 FALSE。任何其它值都被解釋爲 TRUE。 
不推薦用 Iif 函數基於搜索條件創建成員的集合。請改用 Filter 函數根據邏輯表達式評估指定集合中的每個成員,然後返回成員的子集合。

示例
數字
如果 Measures.CurrentMember 是空單元,則下面的示例返回 0,否則返回 1: 
IIf(IsEmpty(Measures.CurrentMember), 0, 1)

字符串 
如果 Measures.CurrentMember 是空單元,則下面的字符串返回字符串 "Yes",否則返回字符串 "No": 
IIf(IsEmpty(Measures.CurrentMember), "Yes", "No")

在Access中我可以用IIF函數進行統計彙總,比如,要知道實際應該交費的用戶個數:
Select sum(iif(金額>0, 1,0)) as num from 費用
在SQL Server中好像沒有對應的函數,我用:
select sum(case when 金額>0 then 1 else 0 end) as num from 費用
好像不太直觀,不知道有沒有其它方法
 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章