plsql 常用函數


    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函數的格式如下:NVL(expr1,expr2)

含義是:如果oracle第一個參數為空那么顯示第二個參數的值,如果第一個參數的值不為空,則顯示第一個參數本來的值。

例如:

SQL> select ename,NVL(comm, -1) from emp;


ENAME NVL(COMM,-1)

——————– ————

SMITH -1

ALLEN 300

WARD 500

JONES -1

MARTIN 1400

BLAKE -1

FORD -1

MILLER -1

其中顯示-1的本來的值全部都是空值的


2 NVL2函數

NVL2函數的格式如下:NVL2(expr1,expr2, expr3)

含義是:如果該函數的第一個參數為空那么顯示第二個參數的值,如果第一個參數的值不為空,則顯示第三個參數的值。

SQL> select ename,NVL2(comm,-1,1) from emp;


ENAME NVL2(COMM,-1,1)

——————– —————

SMITH 1

ALLEN -1

WARD -1

JONES 1

MARTIN -1

BLAKE 1

CLARK 1

SCOTT 1

上面的例子中。凡是結果是1的原來都不為空,而結果是-1的原來的值就是空。


3. NULLIF函數

NULLIF(exp1,expr2)函數的作用是如果exp1和exp2相等則返回空(NULL),否則返回第一個值。

下面是一個例子。使用的是oracle中HR schema,如果HR處於鎖定,請啟用

這里的作用是顯示出那些換過工作的人員原工作,現工作。

SQL> SELECT e.last_name, e.job_id,j.job_id,NULLIF(e.job_id, j.job_id) “Old Job ID”

FROM employees e, job_history j

WHERE e.employee_id = j.employee_id

ORDER BY last_name;


LAST_NAME JOB_ID JOB_ID Old Job ID

————————————————– ——————– ——————– ——————–

De Haan AD_VP IT_PROG AD_VP

Hartstein MK_MAN MK_REP MK_MAN

Kaufling ST_MAN ST_CLERK ST_MAN

Kochhar AD_VP AC_MGR AD_VP

Kochhar AD_VP AC_ACCOUNT AD_VP

Raphaely PU_MAN ST_CLERK PU_MAN

Taylor SA_REP SA_MAN SA_REP

Taylor SA_REP SA_REP

Whalen AD_ASST AC_ACCOUNT AD_ASST

Whalen AD_ASST AD_ASST

可以看到凡是employee。job_id和job_histroy.job_id相等的,都會在結果中輸出NULL即為空,否則顯示的是employee。job_id

4.Coalesce函數

Coalese函數的作用是的NVL的函數有點相似,其優勢是有更多的選項。

格式如下:

Coalesce(expr1, expr2, expr3….. exprn)

Coalesce是這樣來處理這些參數的。如果第一個參數為空,則看第二個參數是否是空,否則則顯示第一個參數,如果第二個參數是空再看第三個參數是否為空,否則顯示第二個參數,依次類推。

這個函數實際上是NVL的循環使用,在此就不舉例子了


SQL語句基礎

--數據操作
SELECT      --從數據庫表中 檢索數據行和列
INSERT      --向數據庫表 添加新數據行
DELETE      --從數據庫表中 刪除數據行
UPDATE      --更新 數據庫表中的數據
--數據定義
CREATE TABLE    --創建一個數據庫表
DROP TABLE     --從數據庫中刪除表
ALTER TABLE     --修改數據庫表結構
CREATE VIEW     --創建一個視圖
DROP VIEW     --從數據庫中刪除視圖
CREATE INDEX    --為數據庫表創建一個索引
DROP INDEX     --從數據庫中刪除索引
CREATE PROCEDURE   --創建一個存儲過程
DROP PROCEDURE    --從數據庫中刪除存儲過程
CREATE TRIGGER    --創建一個觸發器
DROP TRIGGER    --從數據庫中刪除觸發器
CREATE SCHEMA    --向數據庫添加一個新模式
DROP SCHEMA     --從數據庫中刪除一個模式
CREATE DOMAIN    --創建一個數據值域
ALTER DOMAIN    --改變域定義
DROP DOMAIN     --從數據庫中刪除一個域
--數據控制
GRANT      --授予用戶訪問權限
DENY      --拒絕用戶訪問
REVOKE      --解除用戶訪問權限
--事務控制
COMMIT      --結束當前事務
ROLLBACK     --中止當前事務
SET TRANSACTION    --定義當前事務數據訪問特征
--程序化SQL
DECLARE      --為查詢設定游標
EXPLAN      --為查詢描述數據訪問計划
OPEN      --檢索查詢結果打開一個游標
FETCH      --檢索一行查詢結果
CLOSE      --關閉游標
PREPARE      --為動態執行准備SQL 語句
EXECUTE      --動態地執行SQL 語句
DESCRIBE     --描述准備好的查詢


---局部變量
declare @id char(10)
--set @id = '10010001'
select @id = '10010001'

---全局變量
---必須以@@開頭

--IF ELSE
declare @x int @y int @z int
select @x = 1 @y = 2 @z=3
if @x > @y
 print 'x > y' --打印字符串'x > y'
else if @y > @z
 print 'y > z'
else print 'z > y'

--CASE
use pangu
update employee
set e_wage =
 case
  when job_level = ’1’ then e_wage*1.08
  when job_level = ’2’ then e_wage*1.07
  when job_level = ’3’ then e_wage*1.06
  else e_wage*1.05
 end

--WHILE CONTINUE BREAK
declare @x int @y int @c int
select @x = 1 @y=1
while @x < 3
 begin
  print @x --打印變量x 的值
  while @y < 3
   begin
    select @c = 100*@x + @y
    print @c --打印變量c 的值
    select @y = @y + 1
   end
  select @x = @x + 1
  select @y = 1
 end

--WAITFOR
--例 等待1 小時2 分零3 秒后才執行SELECT 語句
waitfor delay ’01:02:03’
select * from employee
--例 等到晚上11 點零8 分后才執行SELECT 語句
waitfor time ’23:08:00’
select * from employee

 

***SELECT***

   select *(列名) from table_name(表名) where column_name operator value
   ex:(宿主)
  select * from stock_information where stockid   = str(nid)
     stockname = 'str_name'
     stockname like '% find this %'
     stockname like '[a-zA-Z]%' --------- ([]指定值的范圍)
     stockname like '[^F-M]%'   --------- (^排除指定范圍)
     --------- 只能在使用like關鍵字的where子句中使用通配符)
     or stockpath = 'stock_path'
     or stocknumber < 1000
     and stockindex = 24
     not stocksex = 'man'
     stocknumber between 20 and 100
     stocknumber in(10,20,30)
     order by stockid desc(asc) --------- 排序,desc-降序,asc-升序
     order by 1,2 --------- by列號
     stockname = (select stockname from stock_information  where stockid  = 4)
     --------- 子查詢
     --------- 除非能確保內層select只返回一個行的值,
     --------- 否則應在外層where子句中用一個in限定符
  select distinct column_name form table_name --------- distinct指定檢索獨有的列值,不重復
  select stocknumber ,"stocknumber + 10" = stocknumber + 10 from table_name
  select stockname , "stocknumber" = count(*) from table_name group by stockname
                                      --------- group by 將表按行分組,指定列中有相同的值
          having count(*) = 2  ---------  having選定指定的組
       
  select *
  from table1, table2                 
  where table1.id *= table2.id -------- 左外部連接,table1中有的而table2中沒有得以null表示
     table1.id =* table2.id -------- 右外部連接


select stockname from table1
  union [all]  -----  union合並查詢結果集,all-保留重復行
  select stockname from table2

***insert***

  insert into table_name (Stock_name,Stock_number) value ("xxx","xxxx")
              value (select Stockname , Stocknumber from Stock_table2)---value為select語句

***update***

  update table_name set Stockname = "xxx" [where Stockid = 3]
         Stockname = default
         Stockname = null
         Stocknumber = Stockname + 4

***delete***

  delete from table_name where Stockid = 3
  truncate table_name ----------- 刪除表中所有行,仍保持表的完整性
  drop table table_name --------------- 完全刪除表

***alter table*** --- 修改數據庫表結構

  alter table database.owner.table_name add column_name char(2) null .....
  sp_help table_name ---- 顯示表已有特征
  create table table_name (name char(20), age smallint, lname varchar(30))
  insert into table_name select ......... ----- 實現刪除列的方法(創建新表)
  alter table table_name drop constraint Stockname_default ---- 刪除Stockname的default約束
   
***function(/*常用函數*/)***

----統計函數----
AVG    --求平均值
COUNT   --統計數目
MAX    --求最大值
MIN    --求最小值
SUM    --求和

 

--AVG
use pangu
select avg(e_wage) as dept_avgWage
from employee
group by dept_id

--MAX
--求工資最高的員工姓名
use pangu
select e_name
from employee
where e_wage =
 (select max(e_wage)
  from employee)

--STDEV()
--STDEV()函數返回表達式中所有數據的標准差

--STDEVP()
--STDEVP()函數返回總體標准差

--VAR()
--VAR()函數返回表達式中所有值的統計變異數

--VARP()
--VARP()函數返回總體變異數

----算術函數----

/***三角函數***/
SIN(float_expression) --返回以弧度表示的角的正弦
COS(float_expression) --返回以弧度表示的角的余弦
TAN(float_expression) --返回以弧度表示的角的正切
COT(float_expression) --返回以弧度表示的角的余切
/***反三角函數***/
ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角
ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角
ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
ATAN2(float_expression1,float_expression2)
        --返回正切是float_expression1 /float_expres-sion2的以弧度表示的角
DEGREES(numeric_expression)
                       --把弧度轉換為角度返回與表達式相同的數據類型可為
        --INTEGER/MONEY/REAL/FLOAT 類型
RADIANS(numeric_expression) --把角度轉換為弧度返回與表達式相同的數據類型可為
        --INTEGER/MONEY/REAL/FLOAT 類型
EXP(float_expression)  --返回表達式的指數值
LOG(float_expression)  --返回表達式的自然對數值
LOG10(float_expression)--返回表達式的以10 為底的對數值
SQRT(float_expression) --返回表達式的平方根
/***取近似值函數***/
CEILING(numeric_expression)  --返回>=表達式的最小整數返回的數據類型與表達式相同可為
        --INTEGER/MONEY/REAL/FLOAT 類型
FLOOR(numeric_expression)    --返回<=表達式的最小整數返回的數據類型與表達式相同可為
        --INTEGER/MONEY/REAL/FLOAT 類型
ROUND(numeric_expression)    --返回以integer_expression 為精度的四舍五入值返回的數據
        --類型與表達式相同可為INTEGER/MONEY/REAL/FLOAT 類型
ABS(numeric_expression)      --返回表達式的絕對值返回的數據類型與表達式相同可為
        --INTEGER/MONEY/REAL/FLOAT 類型
SIGN(numeric_expression)     --測試參數的正負號返回0 零值1 正數或-1 負數返回的數據類型
        --與表達式相同可為INTEGER/MONEY/REAL/FLOAT 類型
PI()       --返回值為π 即3.1415926535897936
RAND([integer_expression])   --用任選的[integer_expression]做種子值得出0-1 間的隨機浮點數

 

----字符串函數----
ASCII()         --函數返回字符表達式最左端字符的ASCII 碼值
CHAR()   --函數用於將ASCII 碼轉換為字符
         --如果沒有輸入0~255之間的ASCII碼值,CHAR函數會返回一個NULL值
LOWER()   --函數把字符串全部轉換為小寫
UPPER()   --函數把字符串全部轉換為大寫
STR()   --函數把數值型數據轉換為字符型數據
LTRIM()   --函數把字符串頭部的空格去掉
RTRIM()   --函數把字符串尾部的空格去掉
LEFT(),RIGHT(),SUBSTRING()  --函數返回部分字符串
RIGHT 函數 [字符串]
--------------------------------------------------------------------------------
  功能
  返回字符串中最右邊的字符。
  語法
  RIGHT ( string-expression, integer-expression )
  參數
  string-expression    從左邊截斷的字符串。
  integer-expression    要返回的從字符串結尾處開始計數的字符數。
  用法
  如果字符串包含多字節字符,並且使用了適當的歸類,則返回的字節數可能大於指定的字符數。

CHARINDEX(),PATINDEX()  --函數返回字符串中某個指定的子串出現的開始位置
SOUNDEX()  --函數返回一個四位字符碼
    --SOUNDEX函數可用來查找聲音相似的字符串但SOUNDEX函數對數字和漢字均只返回0 值    
DIFFERENCE()    --函數返回由SOUNDEX 函數返回的兩個字符表達式的值的差異
    --0 兩個SOUNDEX 函數返回值的第一個字符不同
    --1 兩個SOUNDEX 函數返回值的第一個字符相同
    --2 兩個SOUNDEX 函數返回值的第一二個字符相同
    --3 兩個SOUNDEX 函數返回值的第一二三個字符相同
    --4 兩個SOUNDEX 函數返回值完全相同
                                     

REPLICATE()     --函數返回一個重復character_expression 指定次數的字符串
/*select replicate('abc', 3) replicate( 'abc', -2)
運行結果如下
----------------------
abcabcabc NULL*/

REVERSE()       --函數將指定的字符串的字符排列順序顛倒
REPLACE()       --函數返回被替換了指定子串的字符串
/*select replace('abc123g', '123', 'def')
運行結果如下
----------------------
abcdefg*/


SPACE()   --函數返回一個有指定長度的空白字符串
STUFF()   --函數用另一子串替換字符串指定位置長度的子串


----數據類型轉換函數----
CAST() 函數語法如下
CAST() (<expression> AS <data_ type>[ length ])
CONVERT() 函數語法如下
CONVERT() (<data_ type>[ length ], <expression> [, style])

select cast(100+99 as char) convert(varchar(12), getdate())
運行結果如下
-----------------------
199   Jan 15 2000

----日期函數----
DAY()   --函數返回date_expression 中的日期值
MONTH()   --函數返回date_expression 中的月份值
YEAR()   --函數返回date_expression 中的年份值
DATEADD(<datepart> ,<number> ,<date>)   --函數返回指定日期date 加上指定的額外日期間隔number 產生的新日期
DATEDIFF(<datepart> ,<number> ,<date>)   --函數返回兩個指定日期在datepart 方面的不同之處
DATENAME(<datepart> , <date>)  --函數以字符串的形式返回日期的指定部分
DATEPART(<datepart> , <date>)  --函數以整數值的形式返回日期的指定部分
GETDATE()  --函數以DATETIME 的缺省格式返回系統當前的日期和時間

----系統函數----
APP_NAME()  --函數返回當前執行的應用程序的名稱
COALESCE()  --函數返回眾多表達式中第一個非NULL 表達式的值
COL_LENGTH(<'table_name'>, <'column_name'>) --函數返回表中指定字段的長度值
COL_NAME(<table_id>, <column_id>)   --函數返回表中指定字段的名稱即列名
DATALENGTH() --函數返回數據表達式的數據的實際長度
DB_ID(['database_name']) --函數返回數據庫的編號
DB_NAME(database_id)  --函數返回數據庫的名稱
HOST_ID()     --函數返回服務器端計算機的名稱
HOST_NAME()     --函數返回服務器端計算機的名稱
IDENTITY(<data_type>[, seed increment]) [AS column_name])   --IDENTITY() 函數只在SELECT INTO 語句中使用用於插入一個identity column列到新表中
/*select identity(int, 1, 1) as column_name
 into newtable
 from oldtable*/
ISDATE()  --函數判斷所給定的表達式是否為合理日期
ISNULL(<check_expression>, <replacement_value>) --函數將表達式中的NULL值用指定值替換
ISNUMERIC()  --函數判斷所給定的表達式是否為合理的數值
NEWID()   --函數返回一個UNIQUEIDENTIFIER 類型的數值
NULLIF(<expression1>, <expression2>)   --NULLIF 函數在expression1 與expression2 相等時返回NULL 值若不相等時則返回expression1的值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM