Oracle PL/SQL Tutorial/Conversion Functions/coalesce

Материал из SQL эксперт
Перейти к: навигация, поиск

COALESCE(state, "N/A")

   <source lang="sql">

SQL> SQL> CREATE TABLE publishers(

 2    pub_id   CHAR(3)     NOT NULL,
 3    pub_name VARCHAR(20) NOT NULL,
 4    city     VARCHAR(15) NOT NULL,
 5    state    CHAR(2)     NULL    ,
 6    country  VARCHAR(15) NOT NULL);

Table created. SQL> SQL> INSERT INTO publishers VALUES("P01","A","New York","NY","USA"); 1 row created. SQL> INSERT INTO publishers VALUES("P02","C","San Francisco","CA","USA"); 1 row created. SQL> INSERT INTO publishers VALUES("P03","S","Hamburg",NULL,"Germany"); 1 row created. SQL> INSERT INTO publishers VALUES("P04","T","Berkeley","CA","USA"); 1 row created. SQL> SQL> SQL> SQL> SELECT

 2      pub_id,
 3      city,
 4      COALESCE(state, "N/A") AS "state",
 5      country
 6    FROM publishers;

PUB CITY sta COUNTRY --- --------------- --- --------------- P01 New York NY USA P02 San Francisco CA USA P03 Hamburg N/A Germany P04 Berkeley CA USA SQL> SQL> drop table publishers; Table dropped. SQL> SQL></source>


Use coalesce during the table join

   <source lang="sql">

SQL> SQL> SQL> create table employees(

 2    empno      NUMBER(4)
 3  , ename      VARCHAR2(8)
 4  , init       VARCHAR2(5)
 5  , job        VARCHAR2(8)
 6  , mgr        NUMBER(4)
 7  , bdate      DATE
 8  , msal       NUMBER(6,2)
 9  , comm       NUMBER(6,2)
10  , deptno     NUMBER(2) ) ;

Table created. SQL> SQL> SQL> insert into employees values(1,"Jason", "N", "TRAINER", 2, date "1965-12-18", 800 , NULL, 10); 1 row created. SQL> insert into employees values(2,"Jerry", "J", "SALESREP",3, date "1966-11-19", 1600, 300, 10); 1 row created. SQL> insert into employees values(3,"Jord", "T" , "SALESREP",4, date "1967-10-21", 1700, 500, 20); 1 row created. SQL> insert into employees values(4,"Mary", "J", "MANAGER", 5, date "1968-09-22", 1800, NULL, 20); 1 row created. SQL> insert into employees values(5,"Joe", "P", "SALESREP",6, date "1969-08-23", 1900, 1400, 30); 1 row created. SQL> insert into employees values(6,"Black", "R", "MANAGER", 7, date "1970-07-24", 2000, NULL, 30); 1 row created. SQL> insert into employees values(7,"Red", "A", "MANAGER", 8, date "1971-06-25", 2100, NULL, 40); 1 row created. SQL> insert into employees values(8,"White", "S", "TRAINER", 9, date "1972-05-26", 2200, NULL, 40); 1 row created. SQL> insert into employees values(9,"Yellow", "C", "DIRECTOR",10, date "1973-04-27", 2300, NULL, 20); 1 row created. SQL> insert into employees values(10,"Pink", "J", "SALESREP",null,date "1974-03-28", 2400, 0, 30); 1 row created. SQL> SQL> SQL> create table course_schedule

 2  ( course     VARCHAR2(6)
 3  , begindate  DATE
 4  , trainer    NUMBER(4)
 5  , location   VARCHAR2(20)) ;

Table created. SQL> SQL> SQL> insert into course_schedule values ("SQL",date "1999-04-12",1,"VANCOUVER" ); 1 row created. SQL> insert into course_schedule values ("OAU",date "1999-08-10",2,"CHICAGO"); 1 row created. SQL> insert into course_schedule values ("SQL",date "1999-10-04",3,"SEATTLE"); 1 row created. SQL> insert into course_schedule values ("SQL",date "1999-12-13",4,"DALLAS" ); 1 row created. SQL> insert into course_schedule values ("JAV",date "1999-12-13",5,"SEATTLE"); 1 row created. SQL> insert into course_schedule values ("XML",date "2000-02-03",6,"VANCOUVER" ); 1 row created. SQL> insert into course_schedule values ("JAV",date "2000-02-01",7,"DALLAS" ); 1 row created. SQL> insert into course_schedule values ("PLS",date "2000-09-11",8,"VANCOUVER" ); 1 row created. SQL> insert into course_schedule values ("XML",date "2000-09-18",NULL,"SEATTLE"); 1 row created. SQL> insert into course_schedule values ("OAU",date "2000-09-27",9,"DALLAS" ); 1 row created. SQL> insert into course_schedule values ("ERM",date "2001-01-15",10, NULL ); 1 row created. SQL> insert into course_schedule values ("PRO",date "2001-02-19",NULL,"VANCOUVER" ); 1 row created. SQL> insert into course_schedule values ("RSD",date "2001-02-24",8,"CHICAGO"); 1 row created. SQL> SQL> SQL> create table courses

 2  ( code        VARCHAR2(6)
 3  , description VARCHAR2(30)
 4  , category    CHAR(3)
 5  , duration    NUMBER(2)) ;

Table created. SQL> SQL> SQL> insert into courses values("SQL","SQL course", "GEN",4); 1 row created. SQL> insert into courses values("OAU","Oracle course", "GEN",1); 1 row created. SQL> insert into courses values("JAV","Java course", "BLD",4); 1 row created. SQL> insert into courses values("PLS","PL/SQL course", "BLD",1); 1 row created. SQL> insert into courses values("XML","XML course", "BLD",2); 1 row created. SQL> insert into courses values("ERM","ERM course", "DSG",3); 1 row created. SQL> insert into courses values("PMT","UML course", "DSG",1); 1 row created. SQL> insert into courses values("RSD","C# course", "DSG",2); 1 row created. SQL> insert into courses values("PRO","C++ course", "DSG",5); 1 row created. SQL> insert into courses values("GEN","GWT course", "DSG",4); 1 row created. SQL> SQL> SQL> SQL> select DISTINCT c.code

 2  ,      o.begindate
 3  ,      c.duration
 4  ,      case when o.trainer is not null
 5              then e.ename
 6              else null
 7         end       as trainer
 8  from   employees e
 9  ,      courses   c
10  ,      course_schedule o
11  where  coalesce(o.trainer,-1) in (e.empno,-1)
12  and    o.course = c.code;

CODE BEGINDATE DURATION TRAINER


--------- ---------- --------

JAV 13-DEC-99 4 Joe OAU 27-SEP-00 1 Yellow JAV 01-FEB-00 4 Red RSD 24-FEB-01 2 White OAU 10-AUG-99 1 Jerry PRO 19-FEB-01 5 SQL 04-OCT-99 4 Jord ERM 15-JAN-01 3 Pink XML 18-SEP-00 2 PLS 11-SEP-00 1 White SQL 13-DEC-99 4 Mary SQL 12-APR-99 4 Jason XML 03-FEB-00 2 Black 13 rows selected. SQL> SQL> SQL> drop table employees; Table dropped. SQL> SQL> drop table course_schedule; Table dropped. SQL> SQL> drop table courses; Table dropped. SQL> SQL></source>