plsql常用函式
1)處理字元的函式
|| 或 CONCAT---並置運算子。
格式∶CONCAT(STRING1, STRING2)
例:’ABC’|| ’DE’=’ABCDE’
CONCAT(‘ABC’,’DE’) =’ABCDE’
ASCII---返回字元的ASCII碼。
例:ASCII(‘A’) = 65
CHR---返回指定ASCII碼的字元。
例:CHR(65) = ‘A’
INSTR---搜尋子串位置
格式∶INSTR(STRING , SET[ , 開始位置[ , 出現次數]])
例∶ INSTR (‘this is a test’ , ‘i’ , 1,2)=6
INITCAP---將字串每個單詞首字母均變為大寫
例: INITCAP(‘this is a test’)=’ This Is A Test’’
LENGTH----計算串長
格式∶ LENGTH(string)
RPAD,LPAD---右填充、左填充。預設為填充空格。
格式: RPAD(字串 , 字元個數 , 填充字元)
例: RPAD(‘ABC’ , 6 , ’H’)=’ABCHHH’
LTRIM,RTRIM-----左右截斷。預設為刪除空格。
格式∶ LTRIM(STRING[,’SET’])
例∶ LTRIM(‘***tes*t***’ , ’*’)=’ tes*t***’
LOWER----將字串轉換為小寫
格式∶LOWER(string)
UPPER---將字串轉換為大寫
格式∶UPPER(string)
SUBSTR----提取子串。START為正數時從左開始、為負數時從右開始
格式∶ SUBSTR(STRING , START [ , COUNT])
例∶ SUBSTR(‘WORDSTAR’ , 2 , 3)=’ ORD’
REPLACE---搜尋指定字串並替換
格式∶REPLACE(string , substring , replace_string)
例∶ REPLACE(‘this is a test’ , ‘this’ , ‘that an’)=’that an is a test’
TRIM---刪除字串字首或尾隨字元
格式∶TRIM( [LEADING | TRAILING |BOTH] [ trimchar FROM ] string)
LEADING---刪除字首字元
TRAILING---刪除字尾字元
BOTH---前後綴字元均刪除(預設方式)
Trimchar---指定刪除的字元
注:INSTR,LENGTH,SUBSTR加B時針對位元組.
2)處理數字的函式
LEAST---返回引數列表中的最小值。返回引數型別以第一引數為準
格式∶LEAST(value,value,value,value,value,….)value為數字或字串
例∶ LEAST(1,2,5,-10,9)= -10
SIGN---返回引數的符號位,負數--- -1,0----0,正數---1
格式∶SIGN(value)
CELL---返回大於等於特定值的最小整數
格式∶CELL(value)
例∶ CELL(-10,9)= -10
3)處理日期
SYSDATE---系統時間。精確至秒
ADD_MONTH—加減月份。numvalue為負數時減去相應月份
格式: ADD_MONTH (data1,numvalue)
MONTHS_BETWEEN---返回兩日期之間的月數,當data1
格式: MONTHS_BETWEEN(data1,data2)
LAST_DAY---返回指定日期的最後一天。
格式∶LAST_DAY(date)
TRUNC---將日期按照format格式截短,預設為DD(不是四捨五入)
格式:TRUNC(date, format)
例∶ TRUNC (to_date(‘2002-11-07’,’yyyy-mm-dd’),’MM’)= 2002-11-01
4)分組函式
返回基於多個行的單一結果.
常用函式:
AVG---求平均值
COUNT---返回查詢的行數
MAX---返回查詢列的最大值
MIN---返回查詢列的最小值
SUM---返回查詢列的總和
MAX, MIN常與GROUP BY配套使用
5)轉換函式
TO_DATE---轉換字串為日期型
格式∶ TO_DATE(STRING[,’FORMAT’])
TO_CHAR---轉換日期型或數值型為字串。最重要的函式之一.其FORMAT格式多種多樣
格式∶TO_CHAR(DATE [,’FORMAT’])
FORMAT---具體格式參考ORACLE8i DBA 寶典P835數字格式元素
P836 日期格式元素
TO_NUMBER---轉換字串為數字
格式∶TO_NUMBER(string [ , format])
FORMAT---具體格式參考ORACLE8i DBA 寶典P835數字格式元素
6)其他
DECODE---IF語句的另一形式。將輸入數值與引數列表比較,返回對應值。應用於將表的行轉換成列以及IF語句無法應用的場合。當與SIGN聯合使用時功能擴充套件,可以判斷大於小於的情況.
格式: DECODE(input_value , value1 , result1 , value2 , result2 , ….defult_result)
例∶ DECODE(VALUE,1,100,2,300,500)
當VALUE=1時返回100
當VALUE=2時返回300
否則返回500
DECODE(SIGN(VALUES-100), -1,-10,1,10,0)
當VALUE<100時返回-10
當VALUE>100時返回10
當VALUE=100時返回0
SELECT SUM(DECODE(EST_INT_KEY,77771,1,0)) A,
SUM(DECODE(EST_INT_KEY,77772,1,0)) B,
SUM(DECODE(EST_INT_KEY,77773,1,0)) C
FROM PMS_BLK
NVL---空值置換
格式: NVL(value,替換值)
例: NVL(value,’nullvalue’)當value為NULL值時返回nullvalue否則返回value的值
VSIZE---以位元組為單位返回資料型別尺寸
格式∶VSIZE(資料型別)
例∶ VSIZE(SYSDATE)=8
USER---得到當前使用者名稱
ROWNUM--- oracle系統順序分配為從查詢返回的行的編號,返回的第一行分配的是1,第二行是2,依此類推,這個偽欄位可以用於限制查詢返回的總行數。不能以任何基表的名稱作為字首。可以用在限制返回記錄條數的地方不受ORDER BY的影響.
例∶ select rownum,month,sell from sale where rownum=1
或select rownum,month,sell from sale where rownum<2(返回第一條記錄)
返回rownum在4—10之間的記錄
select rownum,month,sell from sale where rownum<10
minus
select rownum,month,sell from sale where rownum<5;
以下均錯誤:
select rownum,month,sell from sale where rownum=2(1以上)
select rownum,month,sell from sale where rownum>2
ROWID---資料行在物理磁碟上的實體地址,Oracle通過ROWID來定位資料的具體位置,這是存取表中資料的最快的方法.
RETURN---用於函式和過程中.遇見RETURN程式立刻中斷,返回,不再執行剩餘部分.
SQLCODE---返回ORACLE錯誤號。
SQLERRM---返回ORACLE錯誤資訊。
----------------------------------------------------------------------------------------------------------
1、Dateadd
在向指定日期加上一段時間的基礎上,返回新的 datetime 值。
語法 :DATEADD(datepart,number,date)
引數
datepart
是規定應向日期的哪一部分返回新值的引數。下表列出了識別的日期部分和縮寫。
日期部分 縮寫
Year yy, yyyy
quarter qq, q
Month mm, m
dayofyear dy, y
Day dd, d
Week wk, ww
Hour hh
minute mi, n
second ss, s
millisecond ms
number
是用來增加datepart的值。如果指定一個不是整數的值,則將廢棄此值的小數部分。
例如,如果為datepart指定day,為number指定1.75,則date將增加1。
date
是返回datetime或smalldatetime值或日期格式字串的表示式。有關指定日期的更多資訊,請參見datetime和smalldatetime。
如果您只指定年份的最後兩位數字,則小於或等於"兩位數年份截止期"配置選項的值的最後兩位數字的數字所在世紀與截止年所
在世紀相同。大於該選項的值的最後兩位數字的數字所在世紀為截止年所在世紀的前一個世紀。
例如,如果two digit year cutoff 為 2049(預設),則 49 被解釋為 2049,2050 被解釋為 1950。
為避免模糊,請使用四位數的年份。
返回型別
返回 datetime,但如果 date 引數是 smalldatetime,返回 smalldatetime。
2、DATEDIFF
返回跨兩個指定日期的日期和時間邊界數。
一、 語法
DATEDIFF ( datepart , startdate , enddate )
二、引數
datepart
是規定了應在日期的哪一部分計算差額的引數。下表列出了 Microsoft? SQL Server? 識別的日期部分和縮寫。
日期部分 縮寫
year yy, yyyy
quarter qq, q
Month mm, m
dayofyear dy, y
Day dd, d
Week wk, ww
Hour hh
minute mi, n
second ss, s
millisecond ms
startdate
是計算的開始日期。startdate 是返回 datetime 或 smalldatetime 值或日期格式字串的表示式。
因為 smalldatetime 只精確到分鐘,所以當用 smalldatetime 值時,秒和毫秒總是 0。
如果您只指定年份的最後兩位數字,則小於或等於"兩位數年份截止期"配置選項的值的最後兩位數字的數字所在世紀與截止年所在世紀相同。大於該選項的值的最後兩位數字的數字所在世紀為截止年所在世紀的前一個世紀。例如,如果 two digit year cutoff 為 2049(預設),則 49 被解釋為 2049,2050 被解釋為 1950。為避免模糊,請使用四位數的年份。
enddate
是計算的終止日期。enddate 是返回 datetime 或 smalldatetime 值或日期格式字串的表示式。
三、返回型別
integer
四、用法
此函式計算兩個指定日期之間日期部分的數目。結果為日期部分中等於(date2 - date1)的有符號的整數值。
當結果不是日期部分的偶數倍時,DATEDIFF 將被截斷而不是被舍入。
當使用 day 作為日期部分時,DATEDIFF 返回兩個指定的時間之間(包括第二個日期但不包括第一個日期)的午夜數。
當使用 month 作為日期部分時,DATEDIFF 返回兩個日期之間(包括第二個日期但不包括第一個日期)出現的月的第一天的數目。
當使用 week 作為日期部分時,DATEDIFF 返回兩個日期(包括第二個日期但不包括第一個日期)之間星期日的數目。
對於更小的時間單位存在溢位值:
milliseconds 24 天
seconds 68 年
minutes 4083 年
others 沒有溢位限制
如果超出這些限制,此函式將返回溢位錯誤。
五、標準和相容性
SQL/92 Transact-SQL 擴充套件。
SQL/99 Transact-SQL 擴充套件。
Sybase 與 Adaptive Server Enterprise 相容。
六、示例
下面的語句返回 1:
select datediff( hour, ''4:00am'', ''5:50am'' )
下面的語句返回 102:
select datediff( month, ''1987/05/02'', ''1995/11/15'' )
下面的語句返回 0:
select datediff( day, ''00:00'', ''23:59'' )
下面的語句返回 4:
select datediff( day, ''1999/07/19 00:00'',''1999/07/23 23:59'' )
下面的語句返回 0:
select datediff( month, ''1999/07/19'', ''1999/07/23'' )
下面的語句返回 1:
select datediff( month, ''1999/07/19'', ''1999/08/23'' )
3、decode函式
decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,預設值)
該函式的含義如下:
IF 條件=值1 THEN
RETURN(翻譯值1)
ELSIF 條件=值2 THEN
RETURN(翻譯值2)
......
ELSIF 條件=值n THEN
RETURN(翻譯值n)
ELSE
RETURN(預設值)
END IF
·使用方法:
1、比較大小
select decode(sign(變數1-變數2),-1,變數1,變數2) from dual; --取較小值
sign()函式根據某個值是0、正數還是負數,分別返回0、1、-1
例如:
變數1=10,變數2=20
則sign(變數1-變數2)返回-1,decode解碼結果為“變數1”,達到了取較小值的目的。
2、表、檢視結構轉化
現有一個商品銷售表sale,表結構為:
month char(6) --月份
sell number(10,2) --月銷售金額
現有資料為:
200001 1000
200002 1100
200003 1200
200004 1300
200005 1400
200006 1500
200007 1600
200101 1100
200202 1200
200301 1300
想要轉化為以下結構的資料:
year char(4) --年份
month1 number(10,2) --1月銷售金額
month2 number(10,2) --2月銷售金額
month3 number(10,2) --3月銷售金額
month4 number(10,2) --4月銷售金額
month5 number(10,2) --5月銷售金額
month6 number(10,2) --6月銷售金額
month7 number(10,2) --7月銷售金額
month8 number(10,2) --8月銷售金額
month9 number(10,2) --9月銷售金額
month10 number(10,2) --10月銷售金額
month11 number(10,2) --11月銷售金額
month12 number(10,2) --12月銷售金額
結構轉化的SQL語句為:
create or replace view
v_sale(year,month1,month2,month3,month4,month5,month6,
month7,month8,month9,month10,month11,month12)
as
select
substrb(month,1,4),
sum(decode(substrb(month,5,2),'01',sell,0)),
sum(decode(substrb(month,5,2),'02',sell,0)),
sum(decode(substrb(month,5,2),'03',sell,0)),
sum(decode(substrb(month,5,2),'04',sell,0)),
sum(decode(substrb(month,5,2),'05',sell,0)),
sum(decode(substrb(month,5,2),'06',sell,0)),
sum(decode(substrb(month,5,2),'07',sell,0)),
sum(decode(substrb(month,5,2),'08',sell,0)),
sum(decode(substrb(month,5,2),'09',sell,0)),
sum(decode(substrb(month,5,2),'10',sell,0)),
sum(decode(substrb(month,5,2),'11',sell,0)),
sum(decode(substrb(month,5,2),'12',sell,0))
from sale
group by substrb(month,1,4);
4、CAST和CONVERT
將某種資料型別的表示式顯式轉換為另一種資料型別。CAST 和 CONVERT 提供相似的功能。
語法
使用 CAST:
CAST ( expression AS data_type )
使用 CONVERT:
CONVERT (data_type[(length)], expression [, style])
引數
expression
是任何有效的 Microsoft? SQL Server? 表示式。有關更多資訊,請參見表示式。
data_type
目標系統所提供的資料型別,包括 bigint 和 sql_variant。不能使用使用者定義的資料型別。有關可用的資料型別的更多資訊,請參見資料型別。
length
nchar、nvarchar、char、varchar、binary 或 varbinary 資料型別的可選引數。
style
日期格式樣式,藉以將 datetime 或 smalldatetime 資料轉換為字元資料(nchar、nvarchar、char、varchar、nchar 或 nvarchar 資料型別);或者字串格式樣式,藉以將 float、real、money 或 smallmoney 資料轉換為字元資料(nchar、nvarchar、char、varchar、nchar 或 nvarchar 資料型別)。
SQL Server 支援使用科威特演算法的阿拉伯樣式中的資料格式。
在表中,左側的兩列表示將 datetime 或 smalldatetime 轉換為字元資料的 style 值。給 style 值加 100,可獲得包括世紀數位的四位年份 (yyyy)。
不帶世紀數位 (yy) 帶世紀數位 (yyyy)
標準
輸入/輸出**
- 0 或 100 (*) 預設值 mon dd yyyy hh:miAM(或 PM)
1 101 美國 mm/dd/yyyy
2 102 ANSI yy.mm.dd
3 103 英國/法國 dd/mm/yy
4 104 德國 dd.mm.yy
5 105 義大利 dd-mm-yy
6 106 - dd mon yy
7 107 - mon dd, yy
8 108 - hh:mm:ss
- 9 或 109 (*) 預設值 + 毫秒 mon dd yyyy hh:mi:ss:mmmAM(或 PM)
10 110 美國 mm-dd-yy
11 111 日本 yy/mm/dd
12 112 ISO yymmdd
- 13 或 113 (*) 歐洲預設值 + 毫秒 dd mon yyyy hh:mm:ss:mmm(24h)
14 114 - hh:mi:ss:mmm(24h)
- 20 或 120 (*) ODBC 規範 yyyy-mm-dd hh:mm:ss[.fff]
- 21 或 121 (*) ODBC 規範(帶毫秒) yyyy-mm-dd hh:mm:ss[.fff]
- 126(***) ISO8601 yyyy-mm-dd Thh:mm:ss:mmm(不含空格)
- 130* 科威特 dd mon yyyy hh:mi:ss:mmmAM
- 131* 科威特 dd/mm/yy hh:mi:ss:mmmAM
* 預設值(style 0 或 100、9 或 109、13 或 113、20 或 120、21 或 121)始終返回世紀數位 (yyyy)。
** 當轉換為 datetime 時輸入;當轉換為字元資料時輸出。
*** 專門用於 XML。對於從 datetime 或 smalldatetime 到 character 資料的轉換,輸出格式如表中所示。對於從 float、money 或 smallmoney 到 character 資料的轉換,輸出等同於 style 2。對於從 real 到 character 資料的轉換,輸出等同於 style 1。
重要 預設情況下,SQL Server 根據截止年份 2049 解釋兩位數字的年份。即,兩位數字的年份 49 被解釋為 2049,而兩位數字的年份 50 被解釋為 1950。許多客戶端應用程式(例如那些基於 OLE 自動化物件的客戶端應用程式)都使用 2030 作為截止年份。SQL Server 提供一個配置選項("兩位數字的截止年份"),藉以更改 SQL Server 所使用的截止年份並對日期進行一致性處理。然而最安全的辦法是指定四位數字年份。
當從 smalldatetime 轉換為字元資料時,包含秒或毫秒的樣式將在這些位置上顯示零。當從 datetime 或 smalldatetime 值進行轉換時,可以通過使用適當的 char 或 varchar 資料型別長度來截斷不需要的日期部分。
下表顯示了從 float 或 real 轉換為字元資料時的 style 值。
值 輸出
0(預設值) 最大為 6 位數。根據需要使用科學記數法。
1 始終為 8 位值。始終使用科學記數法。
2 始終為 16 位值。始終使用科學記數法。
在下表中,左列表示從 money 或 smallmoney 轉換為字元資料時的 style 值。
值 輸出
0(預設值) 小數點左側每三位數字之間不以逗號分隔,小數點右側取兩位數,例如 4235.98。
1 小數點左側每三位數字之間以逗號分隔,小數點右側取兩位數,例如 3,510.92。
2 小數點左側每三位數字之間不以逗號分隔,小數點右側取四位數,例如 4235.9819。
返回型別
返回與 data type 0 相同的值。
5、CHARINDEX函式
返回字元或者字串在另一個字串中的起始位置。CHARINDEX函式呼叫方法如下:
CHARINDEX ( expression1 , expression2 [ , start_location ] )
Expression1是要到expression2中尋找的字元中,start_location是CHARINDEX函式開始在expression2中找expression1的位置。
CHARINDEX函式返回一個整數,返回的整數是要找的字串在被找的字串中的位置。假如CHARINDEX沒有找到要找的字串,那麼函式整數“0”。讓我們看看下面的函式命令執行的結果:
CHARINDEX('SQL', 'Microsoft SQL Server')
這個函式命令將返回在“Microsoft SQL Server”中“SQL”的起始位置,在這個例子中,CHARINDEX函式將返回“S”在“Microsoft SQL Server”中的位置11。
接下來,我們看這個CHARINDEX命令:
CHARINDEX('7.0', 'Microsoft SQL Server 2000')
在這個例子中,CHARINDEX返回零,因為字串“7.0” 不能在“Microsoft SQL Server”中被找到。接下來通過兩個例子來看看如何使用CHARINDEX函式來解決實際的T-SQL問題。
6、DATEPART
返回代表指定日期的指定日期部分的整數。
語法
DATEPART ( datepart ,date )
引數
datepart
是指定應返回的日期部分的引數。下表列出了 Microsoft? SQL Server? 識別的日期部分和縮寫。
日期部分 縮寫
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
weekday dw
Hour hh
minute mi, n
second ss, s
millisecond ms
week (wk, ww) 日期部分反映對 SET DATEFIRST 作的更改。任何一年的 1 月 1 日定義了 week 日期部分的開始數字,例如:DATEPART(wk, 'Jan 1, xxxx') = 1,此處 xxxx 代表任一年。
weekday (dw) 日期部分返回對應於星期中的某天的數,例如:Sunday = 1、Saturday = 7。weekday 日期部分產生的數取決於 SET DATEFIRST 設定的值,此命令設定星期中的第一天。
date
是返回 datetime 或 smalldatetime 值或日期格式字串的表示式。對 1753 年 1 月 1 日之後的日期用datetime 資料型別。更早的日期儲存為字元資料。當輸入 datetime 值時,始終將其放入引號中。因為 smalldatetime 只精確到分鐘,所以當用 smalldatetime 值時,秒和毫秒總是 0。
如果只指定年份的最後兩位數字,則小於或等於"兩位數年份截止期"配置選項的值的最後兩位數字的數字所在世紀與截止年所在世紀相同。大於該選項的值的最後兩位數字的數字所在世紀為截止年所在世紀的前一個世紀。例如,如果 two digit year cutoff 為 2049 (預設),則 49 被解釋為 2049,2050 被解釋為 1950。為避免模糊,請使用四位數的年份。
有關時間值指定的更多資訊,請參見時間格式。有關日期指定的更多資訊,請參見 datetime 和 smalldatetime。
返回型別
int
註釋
DAY、MONTH、和 YEAR 函式分別是 DATEPART(dd, date)、DATEPART(mm, date)、和 DATEPART(yy, date) 的同義詞。
示例
GETDATE 函式返回當前日期;然而,比較時並不總是需要完整的日期資訊(通常只是對日期的一部分進行比較)。此示例顯示 GETDATE 及 DATEPART 的輸出。
SELECT GETDATE() AS 'Current Date'
GO
下面是結果集:
Current Date
---------------------------
Feb 18 1998 11:46PM
SELECT DATEPART(month, GETDATE()) AS 'Month Number'
GO
下面是結果集:
Month Number
------------
2
此示例假設日期是 5 月 29 日。
SELECT DATEPART(month, GETDATE())
GO
下面是結果集:
-----------
5
(1 row(s) affected)
在此示例中,以數字表示日期。注意:SQL Server 將 0 解釋為 01/01/1900。
SELECT DATEPART(m, 0), DATEPART(d, 0), DATEPART(yy, 0)
下面是結果集:
----- ------ ------
1 1 1900
7、SUBSTRING
功能:返回字元、二進位制、文字或影象表示式的一部分
語法:SUBSTRING ( expression, start, length )
SUBSTR(str,pos): 由<str>中,選出所有從第<pos>位置開始的字元。請注意,這個語法不適用於SQL Server上。
SUBSTR(str,pos,len): 由<str>中的第<pos>位置開始,選出接下去的<len>個字元。
SQL 中的 substring 函式是用來抓出一個欄位資料中的其中一部分。這個函式的名稱在不同的資料庫中不完全一樣:
MySQL: SUBSTR(), SUBSTRING()
Oracle: SUBSTR()
SQL Server: SUBSTRING()
引數:
expression 字串、二進位制字串、文字、影象、列或包含列的表示式。請勿使用包含聚合函式的表示式。
start 整數或可以隱式轉換為 int 的表示式,指定子字串的開始位置。
length 整數或可以隱式轉換為 int 的表示式,指定子字串的長度。
返回值:
如果 expression 是一種支援的字元資料型別,則返回字元資料。如果 expression 是一種支援的二進位制資料型別,則返回二進位制資料。如果 start = 1,則子字串從表示式的第一個字元開始。
返回字串的型別與給定表示式的型別相同(下表所示內容除外)。
給定表示式 返回型別
image varbinary
ntext nvarchar
8、stuff
stuff的功能:刪除指定長度的字串並在指定的起始點插入另一組字元
STUFF ( character_expression , start , length , character_expression )
character_expression :操作的字元,
start:刪除和插入的起始點,
length:刪除的長度,
character_expression :要插入的字元
注:sql的stuff()函式和程式設計中陣列的下標起始位置不一樣,陣列是以0開始的,而 stuff()函式是以 1 開始的。
如果 stuff() 函式以 0 開始的話,它是從expression1_Str 字串的最後一個字元開始擷取。例子如下所示:
例1:stuff('00000000',0,3,'123') --> 對應的結果是: (沒有值輸出)
例2:stuff('00000000',1,3,'123') --> 對應的結果是:12300000
9、ceiling函式 floor函式
ceiling函式返回大於或等於所給數字表達式的最小整數。
floor函式返回小於或等於所給數字表達式的最大整數。
比如
celling(12.1) 結果為 13
floor(12.1)結果為 12
在介紹這個之前你必須明白什麼是oracle中的空值null
1.NVL函式
NVL函式的格式