天天看點

SQL 轉換函數和條件表達式

一、轉換函數

函數的轉換主要對資料類型的轉換

包括: 隐式資料類型轉換、顯示資料類型轉換

1、隐式轉換:

在背景轉換,資料類型與預設格式比對

Oracle服務器可以在表達式中自動執行資料類型轉換。

可以隐式地将VARCHAR2或CHAR值轉換為表達式中的數字或日期資料類型。

2、顯示資料轉換

SQL 轉換函數和條件表達式

a、使用TO_CHAR函數對日期的轉換

TO_CHAR将datetime資料類型轉換為format_model指定格式的VARCHAR2資料類型值。

格式模型是描述存儲在字元串中的datetime格式的字元文字。

to_char(date,‘format_model’)

格式:必須包含在單引号中

大小寫敏感

可以包含任意的有效的日期格式

可以使用fm去掉多餘的空格或者前導零

與日期值用逗号隔開

SQL> select hiredate,to_char(hiredate,‘mm-yyyy’) from emp;

HIREDATE  TO_CHAR
--------- -------
17-DEC-80 12-1980
20-FEB-81 02-1981
22-FEB-81 02-1981
02-APR-81 04-1981
28-SEP-81 09-1981
01-MAY-81 05-1981
09-JUN-81 06-1981
19-APR-87 04-1987
17-NOV-81 11-1981
08-SEP-81 09-1981
23-MAY-87 05-1987
03-DEC-81 12-1981
03-DEC-81 12-1981
23-JAN-82 01-1982

14 rows selected.
           

日期格式的組成

SQL 轉換函數和條件表達式

b 、TO_CHAR函數對數字進行轉換

to_char(number,‘format_model’)

常用的格式:

SQL 轉換函數和條件表達式

Oracle伺服器顯示一串數字元号(#),而不是數字超過格式模型中提供的數字的整數。

Oracle服務器将存儲的decimal值四舍五入到格式模型中提供的小數位數。

c 、to_number函數

使用to_number函數将字元轉換為數字格式:

to_number(char,[ , ‘format_madel’])

d 、 to_date 函數

使用 to_date 函數将字元串轉換為日期格式:

to_date(char,[ , ‘format_madel’])

使用TO_NUMBER和TO_DATE函數

字元串轉換為數字或日期。要完成此任務,可使用TO_NUMBER或TO_DATE函數。

• 字元參數中的标點符号和引号必須與格式模型的相應部分完全比對(大小寫除外)。

• 字元參數不能有額外的空格。

• 字元參數中的數字資料必須與格式模型中的相應元素具有相同的位數。如果沒有fm,字元參數中的數字可以省略前導零。

3. 嵌套函數

單層函數可以嵌套到任意層級

嵌套函數的執行順序是由内到外。

4. 通用函數

a、 nvl 函數

nvl (expr1,expr2)

将空值轉換成一個已知的值:

可以使用的資料類型有數字、日期、字元。

資料類型必須比對:

SQL 轉換函數和條件表達式

b 、nvl2 函數

nvl2(expr1,expr2,expr3)

如果expr1不是null,那麼轉換為expr2,如果exprt1 是空值,則轉換為expr3

SQL> select ename , sal , comm , sal+nvl(comm,0),nvl2(comm,sal+comm,sal)
  2  from emp;

ENAME             SAL       COMM SAL+NVL(COMM,0) NVL2(COMM,SAL+COMM,SAL)
---------- ---------- ---------- --------------- -----------------------
SMITH             800                        800                     800
ALLEN            1600        300            1900                    1900
WARD             1250        500            1750                    1750
JONES            2975                       2975                    2975
MARTIN           1250       1400            2650                    2650
BLAKE            2850                       2850                    2850
CLARK            2450                       2450                    2450
SCOTT            3000                       3000                    3000
KING             5000                       5000                    5000
TURNER           1500          0            1500                    1500
ADAMS            1100                       1100                    1100
JAMES             950                        950                     950
FORD             3000                       3000                    3000
MILLER           1300                       1300                    1300

14 rows selected.
           

c 、 nullif 函數

NULLIF函數比較兩個表達式。如果它們相等,函數傳回null。

如果它們不相等,函數傳回第一個表達式。但是不能為第一個表達式指定文字NULL。

SQL> select length(ename),length(job),nullif(length(ename),length(job))
  2  from emp;

LENGTH(ENAME) LENGTH(JOB) NULLIF(LENGTH(ENAME),LENGTH(JOB))
------------- ----------- ---------------------------------
            5           5
            5           8                                 5
            4           8                                 4
            5           7                                 5
            6           8                                 6
            5           7                                 5
            5           7                                 5
            5           7                                 5
            4           9                                 4
            6           8                                 6
            5           5
           

d 、coalesce 函數

傳回表達式清單中的第一個非空表達式。

coalesce與nvl相比的優點在于coalesce可以同時處理交替的多個值。

如果第一個表達式非空,則傳回這個表達式,對其他的參數進行coalesce。

二 、條件表達式

在SQL語句中使用 IF - THEN - ELSE邏輯

使用兩種方式:

  1. CASE表達式
  2. DECODE函數

#查詢員工姓名,職位,薪資和獎金

當職位為ANALYST的員工年薪按照150%進行發放

如果職位是salesman的員工年薪按照140%進行發放

如果職位是MANAGER的員工年薪按照130%進行發放

其他職位的員工年薪按照正常的進行發放

1、case表達式

SQL> select ename,job,sal,comm,

2 case job when ‘ANALYST’ then (sal*12+nvl(comm,0))1.5

3 when ‘SALESMAN’ then (sal12+nvl(comm,0))1.4

4 when ‘MANAGER’ then (sal12+nvl(comm,0))1.3

5 else sal12+nvl(comm,0) end “year_sal”

6 from emp;

ENAME      JOB              SAL       COMM   year_sal
---------- --------- ---------- ---------- ----------
SMITH      CLERK            800                  9600
ALLEN      SALESMAN        1600        300      27300
WARD       SALESMAN        1250        500      21700
JONES      MANAGER         2975                 46410
MARTIN     SALESMAN        1250       1400      22960
BLAKE      MANAGER         2850                 44460
CLARK      MANAGER         2450                 38220
SCOTT      ANALYST         3000                 54000
KING       PRESIDENT       5000                 60000
TURNER     SALESMAN        1500          0      25200
ADAMS      CLERK           1100                 13200

ENAME      JOB              SAL       COMM   year_sal
---------- --------- ---------- ---------- ----------
JAMES      CLERK            950                 11400
FORD       ANALYST         3000                 54000
MILLER     CLERK           1300                 15600

14 rows selected.
           

2,decode函數

SQL> select ename,job,sal,comm,
  2  decode(job,'ANALYST',(sal*12+nvl(comm,0))*1.5,    
  3              'SALESMAN',(sal*12+nvl(comm,0))*1.4,
  4              'MANAGER',(sal*12+nvl(comm,0))*1.3,
  5             sal*12+nvl(comm,0)) "new_sal"
  6  from emp;

ENAME      JOB              SAL       COMM    new_sal
---------- --------- ---------- ---------- ----------
SMITH      CLERK            800                  9600
ALLEN      SALESMAN        1600        300      27300
WARD       SALESMAN        1250        500      21700
JONES      MANAGER         2975                 46410
MARTIN     SALESMAN        1250       1400      22960
BLAKE      MANAGER         2850                 44460
CLARK      MANAGER         2450                 38220
SCOTT      ANALYST         3000                 54000
KING       PRESIDENT       5000                 60000
TURNER     SALESMAN        1500          0      25200
ADAMS      CLERK           1100                 13200

ENAME      JOB              SAL       COMM    new_sal
---------- --------- ---------- ---------- ----------
JAMES      CLERK            950                 11400
FORD       ANALYST         3000                 54000
MILLER     CLERK           1300                 15600

14 rows selected.