この章の内容は次のとおりです。
|
注意: このマニュアルのチュートリアルを行うには、ユーザーHRとして、SQL DeveloperからOracle Database XEに接続している必要があります。 |
問合せ、つまりSQLのSELECT文は、1つ以上の表またはビューからデータを選択します。
SELECT select_list FROM source_list
select_listは、データが選択される列を指定し、source_listは、それらの列を含む表またはビューを指定します。
別のSQL文内にネストされた問合せは、副問合せと呼ばれます。
SQL*Plus環境では、SQL>プロンプトに続いて問合せを入力できます。
SQL Developer環境では、SQLワークシートに問合せを入力できます。
|
参照:
|
ここでは、SQL DeveloperからユーザーHRとしてOracle Database XEへ接続している場合に、問合せやその他のSQL文を(SQL Developerで)実行する方法について説明します。
SQL Developerにおいて問合せを実行するには、次の手順を実行します。
「SQLワークシート」アイコンをクリックします。
「接続の選択」ウィンドウまたは「SQLワークシート」ペインが表示されます。
「接続の選択」ウィンドウが開かれた場合は、次のようにします。
「接続」フィールドの値がhr_connではない場合は、メニューからその値を選択します。
「OK」をクリックします。
「SQLワークシート」ペインが表示され、「hr_conn」というラベルのタブと、「ワークシート」および「クエリー・ビルダー」の2つのサブペインが表示されます。ワークシートにはSQL文を入力できます。
ワークシートに問合せ(SELECT文)を入力します。
「文の実行」アイコンをクリックします。
問合せが実行されます。ワークシートの下に「問合せ結果」ペインが表示され、問合せの結果が表示されます。
「hr_conn」タブの下で、「クリア」アイコンをクリックします。
問合せが消去され、ワークシートに別のSQL文を入力できます。別のSQL文を実行すると、その結果が前に実行したSQL文の結果のかわりに「問合せ結果」ペインに表示されます。
|
参照: SQL DeveloperにおけるSQLワークシートの使用の詳細は、『Oracle Database SQL Developerユーザーズ・ガイド』を参照してください。 |
このチュートリアルは、EMPLOYEES表の列を選択する方法を示します。
EMPLOYEES表のすべての列を選択するには、次の手順を実行します。
タブ「hr_conn」が含まれる「SQLワークシート」ペインがあれば、それを選択します。そうでない場合は、「SQL Developerにおける問合せの実行」にあるように、「SQLワークシート」アイコンをクリックします。
ワークシートに、次の問合せを入力します。
SELECT * FROM EMPLOYEES;
「文の実行」アイコンをクリックします。
問合せが実行されます。ワークシートの下に「問合せ結果」ペインが表示され、EMPLOYEES表のすべての列が表示されます。
|
注意: パスワードやクレジット・カード情報などの機密データを保存する列が含まれる表でSELECT *を使用する場合は十分に注意してください。 |
このチュートリアルでは、EMPLOYEES表のFIRST_NAME列、LAST_NAME列およびDEPARTMENT_ID列のみを選択する方法を示します。
FIRST_NAME、LAST_NAMEおよびDEPARTMENT_IDのみを選択するには、次の手順を実行します。
タブ「hr_conn」が含まれる「SQLワークシート」ペインがあれば、それを選択します。そうでない場合は、「SQL Developerにおける問合せの実行」にあるように、「SQLワークシート」アイコンをクリックします。
ワークシートに、次の問合せを入力します。
SELECT FIRST_NAME, LAST_NAME, DEPARTMENT_ID FROM EMPLOYEES;
「文の実行」アイコンをクリックします。
問合せが実行されます。ワークシートの下に「問合せ結果」ペインが表示され、次のような問合せの結果が表示されます。
FIRST_NAME LAST_NAME DEPARTMENT_ID -------------------- ------------------------- ------------- Donald OConnell 50 Douglas Grant 50 Jennifer Whalen 10 Michael Hartstein 20 Pat Fay 20 Susan Mavris 40 Hermann Baer 70 Shelley Higgins 110 William Gietz 110 Steven King 90 Neena Kochhar 90 FIRST_NAME LAST_NAME DEPARTMENT_ID -------------------- ------------------------- ------------- Lex De Haan 90 ... Kevin Feeney 50 107 rows selected.
問合せ結果を表示する際に、デフォルトの列ヘッダーは列名です。新規のヘッダーの下に列が表示されるようにするには、列名の直後に新規のヘッダー(別名)を指定します。別名により、問合せの期間に対する列名が変更されますが、データベース内の対応する名前は変更されません。
例4-1の問合せは、「チュートリアル: 表の特定の列の選択」の問合せと同じ列を選択しますが、列の別名も指定します。別名が二重引用符で囲まれていないので、大文字で表示されます。
例4-1 新規のヘッダーの下での選択された列の表示
SELECT FIRST_NAME First, LAST_NAME last, DEPARTMENT_ID DepT FROM EMPLOYEES;
結果は次のようになります。
FIRST LAST DEPT -------------------- ------------------------- ---------- Donald OConnell 50 Douglas Grant 50 Jennifer Whalen 10 Michael Hartstein 20 Pat Fay 20 Susan Mavris 40 Hermann Baer 70 Shelley Higgins 110 William Gietz 110 Steven King 90 Neena Kochhar 90 FIRST LAST DEPT -------------------- ------------------------- ---------- Lex De Haan 90 ... Kevin Feeney 50 107 rows selected.
列の別名を二重引用符で囲むと、例4-2のように、大/小文字の区別が保持され、別名に空白を使用することも可能です。
例4-2 列の別名における大/小文字の区別の保持および空白の使用
SELECT FIRST_NAME "Given Name", LAST_NAME "Family Name" FROM EMPLOYEES;
結果は次のようになります。
Given Name Family Name -------------------- ------------------------- Donald OConnell Douglas Grant Jennifer Whalen Michael Hartstein Pat Fay Susan Mavris Hermann Baer Shelley Higgins William Gietz Steven King Neena Kochhar Given Name Family Name -------------------- ------------------------- Lex De Haan ... Kevin Feeney 107 rows selected.
|
参照: 列の別名(c_alias)を含むSELECT文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
指定された条件に一致するデータのみを選択するには、SELECT文にWHERE句を含めます。WHERE句には、任意のSQL条件を使用できます。(SQL条件の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。)
例4-3の問合せは、部門90に所属する従業員のデータのみを選択します。
例4-3 1つの部門からのデータの選択
SELECT FIRST_NAME, LAST_NAME, DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 90;
結果は次のようになります。
FIRST_NAME LAST_NAME DEPARTMENT_ID -------------------- ------------------------- ------------- Steven King 90 Neena Kochhar 90 Lex De Haan 90
例4-4の問合せは、部門100、110および120に所属する従業員のデータのみを選択します。
例4-4 指定された部門からのデータの選択
SELECT FIRST_NAME, LAST_NAME, DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN (100, 110, 120);
結果は次のようになります。
FIRST_NAME LAST_NAME DEPARTMENT_ID -------------------- ------------------------- ------------- John Chen 100 Daniel Faviet 100 William Gietz 110 Nancy Greenberg 100 Shelley Higgins 110 Luis Popp 100 Ismael Sciarra 100 Jose Manuel Urman 100 8 rows selected.
部門120に所属する従業員はいません。
例4-5の問合せは、姓が「Ma」で始まる従業員のデータのみを選択します。
例4-5 同じ部分文字列で始まる姓を持つデータの選択
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE LAST_NAME LIKE 'Ma%';
結果は次のようになります。
FIRST_NAME LAST_NAME -------------------- ------------------------- Jason Mallin Steven Markle James Marlow Mattea Marvins Randall Matos Susan Mavris 6 rows selected.
例4-6の問合せは、姓に「ma」を含む従業員のデータのみを選択します。
例4-6 同じ部分文字列を含む姓を持つデータの選択
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE LAST_NAME LIKE '%ma%';
結果は次のようになります。
FIRST_NAME LAST_NAME -------------------- ------------------------- Sundita Kumar Jose Manuel Urman Shanta Vollman
例4-7の問合せは、給与が少なくとも11000であり、かつ歩合率がNULLではないという2つの条件をテストします。
例4-7 2つの条件を満たすデータの選択
SELECT FIRST_NAME, LAST_NAME, SALARY, COMMISSION_PCT "%"
FROM EMPLOYEES
WHERE (SALARY >= 11000) AND (COMMISSION_PCT IS NOT NULL);
結果は次のようになります。
FIRST_NAME LAST_NAME SALARY % -------------------- ------------------------- ---------- ---------- John Russell 14000 .4 Karen Partners 13500 .3 Alberto Errazuriz 12000 .3 Gerald Cambrault 11000 .3 Lisa Ozer 11500 .25 Ellen Abel 11000 .3 6 rows selected.
|
参照:
|
「指定された条件を満たすデータの選択」で述べたように、WHERE句の条件には、任意のSQL条件を使用できます。このトピックでは、正規表現を受け入れるSQLファンクションを使用して条件を指定する方法を示します。正規表現は、検索アルゴリズムを指定するメタ文字、および文字を指定するリテラルを使用して、検索パターンを定義します。
EMPLOYEES表内のすべてのマネージャを選択する場合を考えます。マネージャのJOB_IDの末尾は、部門に応じて、'_MGR'または'_MAN'となります。このため、検索パターンは正規表現である必要があり、例4-8のようにREGEXP_LIKEファンクションを使用する必要があります。
正規表現(_m[an|gr])において、メタ文字|は、OR条件を示します。3番目のファンクション・パラメータ'i'は、大/小文字を区別しない一致を指定します。
例4-8 EMPLOYEES表のすべてのマネージャの選択
SELECT FIRST_NAME, LAST_NAME, JOB_ID
FROM EMPLOYEES
WHERE REGEXP_LIKE(JOB_ID, '(_m[an|gr])', 'i');
結果は次のようになります。
FIRST_NAME LAST_NAME JOB_ID -------------------- ------------------------- ---------- Michael Hartstein MK_MAN Shelley Higgins AC_MGR Nancy Greenberg FI_MGR Den Raphaely PU_MAN Matthew Weiss ST_MAN Adam Fripp ST_MAN Payam Kaufling ST_MAN Shanta Vollman ST_MAN Kevin Mourgos ST_MAN John Russell SA_MAN Karen Partners SA_MAN FIRST_NAME LAST_NAME JOB_ID -------------------- ------------------------- ---------- Alberto Errazuriz SA_MAN Gerald Cambrault SA_MAN Eleni Zlotkey SA_MAN 14 rows selected.
姓に二重母音(同じ母音が2つ続くもの)を含むすべての従業員を選択する場合を考えます。例4-9に、その方法を示します。
正規表現([AEIOU])は任意の母音を表します。メタ文字\1は、最初の(この場合は唯一の)正規表現を表します。3番目のファンクション・パラメータ'i'は、大/小文字を区別しない一致を指定します。
例4-9 姓に二重母音を含むすべての従業員の選択
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE REGEXP_LIKE(LAST_NAME, '([AEIOU])\1', 'i');
結果は次のようになります。
FIRST_NAME LAST_NAME -------------------- ------------------------- Harrison Bloom Lex De Haan Kevin Feeney Ki Gee Nancy Greenberg Danielle Greene Alexander Khoo David Lee 8 rows selected.
表示された問合せ結果において、nnn.nnn.nnnnの形式で格納された電話番号を同等の形式(nnn) nnn-nnnnに置換する場合を考えます。例4-10のように、検索パターン(格納形式)に正規表現を使用し、さらに、置換文字列(表示形式)にそれらの正規表現への参照を使用して、REGEXP_REPLACEファンクションを使用します。
検索パターンには3つの正規表現が含まれ、それぞれが丸括弧で囲まれています。メタ文字[[:digit:]]は数字を表し、メタ文字{n}はn回発生することを指定し、メタ文字\はエスケープ文字です。エスケープ文字の直後の文字は、リテラルと解釈されます。エスケープ文字がない場合、メタ文字.は任意の文字を表します。
置換文字列は、1番目、2番目および3番目の正規表現を表すのに、\1、\2および\3を使用します。(置換文字列において、\はエスケープ文字ではありません。)
例4-10 別の形式での電話番号の表示
SELECT PHONE_NUMBER "Old Format", REGEXP_REPLACE(PHONE_NUMBER, '([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})', '(\1) \2-\3') "New Format" FROM EMPLOYEES WHERE DEPARTMENT_ID = 90;
結果は次のようになります。
Old Format New Format -------------------- --------------------------------------------------------- 515.123.4567 (515) 123-4567 515.123.4568 (515) 123-4568 515.123.4569 (515) 123-4569
LOCATIONS表の各STREET_ADDRESSから、番地番号を抽出するとします。一部の番地番号にはハイフンが含まれるため、例4-11に示すように、検索パターンに正規表現を使用し、REGEXP_SUBSTRファンクションを使用する必要があります。
例4-11 各STREET_ADDRESSからの番地番号の抽出
COLUMN Number FORMAT A8
SELECT STREET_ADDRESS "Address",
REGEXP_SUBSTR(STREET_ADDRESS, '[[:digit:]-]+') "Number"
FROM LOCATIONS;
COLUMN Number CLEAR
結果は次のようになります。
Address Number ---------------------------------------- -------- 1297 Via Cola di Rie 1297 93091 Calle della Testa 93091 2017 Shinjuku-ku 2017 9450 Kamiya-cho 9450 2014 Jabberwocky Rd 2014 2011 Interiors Blvd 2011 2007 Zagora St 2007 2004 Charade Rd 2004 147 Spadina Ave 147 6092 Boxwood St 6092 40-5-12 Laogianggen 40-5-12 Address Number ---------------------------------------- -------- 1298 Vileparle (E) 1298 12-98 Victoria Street 12-98 198 Clementi North 198 8204 Arthur St 8204 Magdalen Centre, The Oxford Science Park 9702 Chester Road 9702 Schwanthalerstr. 7031 7031 Rua Frei Caneca 1360 1360 20 Rue des Corps-Saints 20 Murtenstrasse 921 921 Pieter Breughelstraat 837 837 Address Number ---------------------------------------- -------- Mariano Escobedo 9991 9991 23 rows selected.
各STREET_ADDRESSにある空白の数をカウントするには、例4-12のように、REGEXP_COUNTファンクションを使用できます。
例4-12 各STREET_ADDRESSにある空白数のカウント
SELECT STREET_ADDRESS,
REGEXP_COUNT(STREET_ADDRESS, ' ') "Number of Spaces"
FROM LOCATIONS;
結果は次のようになります。
STREET_ADDRESS Number of Spaces ---------------------------------------- ---------------- 1297 Via Cola di Rie 4 93091 Calle della Testa 3 2017 Shinjuku-ku 1 9450 Kamiya-cho 1 2014 Jabberwocky Rd 2 2011 Interiors Blvd 2 2007 Zagora St 2 2004 Charade Rd 2 147 Spadina Ave 2 6092 Boxwood St 2 40-5-12 Laogianggen 1 STREET_ADDRESS Number of Spaces ---------------------------------------- ---------------- 1298 Vileparle (E) 2 12-98 Victoria Street 2 198 Clementi North 2 8204 Arthur St 2 Magdalen Centre, The Oxford Science Park 5 9702 Chester Road 2 Schwanthalerstr. 7031 1 Rua Frei Caneca 1360 4 20 Rue des Corps-Saints 3 Murtenstrasse 921 1 Pieter Breughelstraat 837 2 STREET_ADDRESS Number of Spaces ---------------------------------------- ---------------- Mariano Escobedo 9991 2 23 rows selected.
各STREET_ADDRESSに最初に表示される空白の位置をレポートするには、例4-13のように、REGEXP_INSTRファンクションを使用できます。
例4-13 各STREET_ADDRESSに最初に表示される空白の位置のレポート
SELECT STREET_ADDRESS,
REGEXP_INSTR(STREET_ADDRESS, ' ') "First Space"
FROM LOCATIONS;
結果は次のようになります。
STREET_ADDRESS First Space ---------------------------------------- ----------- 1297 Via Cola di Rie 5 93091 Calle della Testa 6 2017 Shinjuku-ku 5 9450 Kamiya-cho 5 2014 Jabberwocky Rd 5 2011 Interiors Blvd 5 2007 Zagora St 5 2004 Charade Rd 5 147 Spadina Ave 4 6092 Boxwood St 5 40-5-12 Laogianggen 8 STREET_ADDRESS First Space ---------------------------------------- ----------- 1298 Vileparle (E) 5 12-98 Victoria Street 6 198 Clementi North 4 8204 Arthur St 5 Magdalen Centre, The Oxford Science Park 9 9702 Chester Road 5 Schwanthalerstr. 7031 17 Rua Frei Caneca 1360 4 20 Rue des Corps-Saints 3 Murtenstrasse 921 14 Pieter Breughelstraat 837 7 STREET_ADDRESS First Space ---------------------------------------- ----------- Mariano Escobedo 9991 8 23 rows selected.
|
参照:
|
問合せの結果を表示する際に、ORDER BY句で順序を指定しないかぎり、レコードは任意の順序で表示できます。
例4-14の問合せの結果は、LAST_NAMEによって、昇順(デフォルト)にソートされています。
また、SQL Developerでは、ORDER BY句を省略し、列の名前をダブルクリックしてソートすることもできます。
例4-14 LAST_NAMEによる選択されたデータのソート
SELECT FIRST_NAME, LAST_NAME, HIRE_DATE
FROM EMPLOYEES
ORDER BY LAST_NAME;
結果:
FIRST_NAME LAST_NAME HIRE_DATE -------------------- ------------------------- --------- Ellen Abel 11-MAY-96 Sundar Ande 24-MAR-00 Mozhe Atkinson 30-OCT-97 David Austin 25-JUN-97 Hermann Baer 07-JUN-94 Shelli Baida 24-DEC-97 Amit Banda 21-APR-00 Elizabeth Bates 24-MAR-99 ... FIRST_NAME LAST_NAME HIRE_DATE -------------------- ------------------------- --------- Jose Manuel Urman 07-MAR-98 Peter Vargas 09-JUL-98 Clara Vishney 11-NOV-97 Shanta Vollman 10-OCT-97 Alana Walsh 24-APR-98 Matthew Weiss 18-JUL-96 Jennifer Whalen 17-SEP-87 Eleni Zlotkey 29-JAN-00 107 rows selected
例4-15に示すように、ソート基準を選択リストに含める必要はありません。
例4-15 選択対象ではない列による選択されたデータのソート
SELECT FIRST_NAME, HIRE_DATE FROM EMPLOYEES ORDER BY LAST_NAME;
結果:
FIRST_NAME HIRE_DATE -------------------- --------- Ellen 11-MAY-96 Sundar 24-MAR-00 Mozhe 30-OCT-97 David 25-JUN-97 Hermann 07-JUN-94 Shelli 24-DEC-97 Amit 21-APR-00 Elizabeth 24-MAR-99 ... FIRST_NAME HIRE_DATE -------------------- --------- Jose Manuel 07-MAR-98 Peter 09-JUL-98 Clara 11-NOV-97 Shanta 10-OCT-97 Alana 24-APR-98 Matthew 18-JUL-96 Jennifer 17-SEP-87 Eleni 29-JAN-00 107 rows selected.
|
参照: ORDER BY句を含むSELECT文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
すべての従業員のFIRST_NAME、LAST_NAMEおよびDEPARTMENT_NAMEを選択する場合を考えます。FIRST_NAMEおよびLAST_NAMEはEMPLOYEES表にあり、DEPARTMENT_NAMEはDEPARTMENTS表にあります。どちらの表にもDEPARTMENT_IDがあります。この場合、例4-16の問合せを使用できます。このような問合せを結合と呼びます。
例4-16 2つの表からのデータの選択(2つの表の結合)
SELECT EMPLOYEES.FIRST_NAME "First",
EMPLOYEES.LAST_NAME "Last",
DEPARTMENTS.DEPARTMENT_NAME "Dept. Name"
FROM EMPLOYEES, DEPARTMENTS
WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID;
結果:
First Last Dept. Name -------------------- ------------------------- ------------------------------ Jennifer Whalen Administration Michael Hartstein Marketing Pat Fay Marketing Den Raphaely Purchasing Karen Colmenares Purchasing Alexander Khoo Purchasing Shelli Baida Purchasing Sigal Tobias Purchasing Guy Himuro Purchasing Susan Mavris Human Resources Donald OConnell Shipping First Last Dept. Name -------------------- ------------------------- ------------------------------ Douglas Grant Shipping ... Shelley Higgins Accounting 106 rows selected.
テーブル名修飾子は、結合内の一方の表にのみ現れる列名に対してはオプションですが、両方の表に現れる列名に対しては必須です。次の問合せは、例4-16の問合せと同等です。
SELECT FIRST_NAME "First", LAST_NAME "Last", DEPARTMENT_NAME "Dept. Name" FROM EMPLOYEES, DEPARTMENTS WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID;
修飾された列名を使用する問合せを読みやすくするには、次の例のように、表の別名を使用します。
SELECT FIRST_NAME "First", LAST_NAME "Last", DEPARTMENT_NAME "Dept. Name" FROM EMPLOYEES e, DEPARTMENTS d WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID;
FROM句で別名を作成するのではなく、次の例のように、問合せの中で先に作成することも可能です。
SELECT e.FIRST_NAME "First", e.LAST_NAME "Last", d.DEPARTMENT_NAME "Dept. Name" FROM EMPLOYEES e, DEPARTMENTS d WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID;
|
参照: 結合の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
問合せのselect_listには、SQL演算子およびSQLファンクションを含むSQL式が含まれます。これらの演算子およびファンクションは、オペランドおよび引数として表データを持つことが可能です。SQL式を評価して、得られた値が問合せの結果に表示されます。
トピック:
|
参照:
|
SQLは、基本的な算術演算子として+(加算)、-(減算)、*(乗算)および/(除算)をサポートしています。
例4-17の問合せは、部門90に所属する各従業員のLAST_NAME、SALARY(月給)および年間賃金をSALARYの降順で表示します。
数値ファンクションは、数値入力を受け取り、数値を返します。各数値ファンクションは、評価される各行に対し、値を1つ返します。SQLがサポートする数値ファンクションのリストと説明については、『Oracle Database SQL言語リファレンス』を参照してください。
例4-18の問合せは、数値ファンクションROUNDを使用して、部門100の各従業員の日給を1セント未満は四捨五入して表示します。
例4-18 数値データの四捨五入
SELECT LAST_NAME,
ROUND (((SALARY * 12)/365), 2) "Daily Pay"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;
結果:
LAST_NAME Daily Pay ------------------------- ---------- Chen 269.59 Faviet 295.89 Greenberg 394.52 Popp 226.85 Sciarra 253.15 Urman 256.44 6 rows selected.
例4-19の問合せは、数値ファンクションTRUNCを使用して、部門100の各従業員の日給を1ドル未満は切り捨てて表示します。
例4-19 数値データの切捨て
SELECT LAST_NAME,
TRUNC ((SALARY * 12)/365) "Daily Pay"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;
結果:
LAST_NAME Daily Pay ------------------------- ---------- Chen 269 Faviet 295 Greenberg 394 Popp 226 Sciarra 253 Urman 256 6 rows selected.
|
参照: SQL数値ファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
連結演算子(||)は、1番目の文字列に2番目の文字列を追加することによって、2つの文字列を1つに結合します。たとえば、'a'||'b'='ab'となります。この演算子を使用すると、例4-20の問合せのように、2つの列または式の情報をレポートの同じ列の中に結合できます。
文字ファンクションは、文字入力を受け取ります。多くは文字の値を返しますが、数値を返すものもあります。各文字ファンクションは、評価される各行に対し、値を1つ返します。SQLがサポートする文字ファンクションのリストと説明については、『Oracle Database SQL言語リファレンス』を参照してください。
UPPER、INITCAPおよびLOWERファンクションは文字引数をそれぞれ、すべて大文字、頭文字のみ大文字および、すべて小文字で表示します。
例4-21の問合せは、LAST_NAMEを大文字で、FIRST_NAMEは頭文字を大文字で他は小文字で、EMAILを小文字で表示します。
例4-21 文字データの大/小文字の変更
SELECT UPPER(LAST_NAME) "Last", INITCAP(FIRST_NAME) "First", LOWER(EMAIL) "E-Mail" FROM EMPLOYEES WHERE DEPARTMENT_ID = 100 ORDER BY EMAIL;
結果:
Last First E-Mail ------------------------- -------------------- ------------------------- FAVIET Daniel dfaviet SCIARRA Ismael isciarra CHEN John jchen URMAN Jose Manuel jmurman POPP Luis lpopp GREENBERG Nancy ngreenbe 6 rows selected.
LTRIMおよびRTRIMファンクションはそれぞれ、文字引数の左端および右端から文字を切り捨てます。 TRIMファンクションは、先頭のゼロ、末尾のゼロ、あるいはその両方を切り捨てます。
例4-22の問合せは、EMPLOYEES表内のすべての事務員を検出し、JOB_IDから'_CLERK'を切り捨て、事務員の種別を識別する文字列のみを表示します。
例4-22 文字データの切捨て
SELECT LAST_NAME, RTRIM(JOB_ID, '_CLERK') "Clerk Type" FROM EMPLOYEES WHERE JOB_ID LIKE '%_CLERK' ORDER BY LAST_NAME;
結果:
LAST_NAME Clerk Type ------------------------- ---------- Atkinson ST Baida PU Bell SH Bissot ST Bull SH Cabrio SH Chung SH Colmenares PU Davies ST Dellinger SH Dilly SH LAST_NAME Clerk Type ------------------------- ---------- Everett SH Feeney SH ... LAST_NAME Clerk Type ------------------------- ---------- Walsh SH 45 rows selected.
LPADおよびRPADファンクションは、それぞれ、文字引数の左側と右側に指定された文字(デフォルト文字は空白)を埋め込みます。
例4-23の問合せは、FIRST_NAMEおよびLAST_NAMEを15文字の列に表示する際に、FIRST_NAMEの左側とLAST_NAMEの右側に空白を埋め込みます。
例4-23 文字データの埋込み
SELECT LPAD(FIRST_NAME,15) "First", RPAD(LAST_NAME,15) "Last" FROM EMPLOYEES WHERE DEPARTMENT_ID = 100 ORDER BY FIRST_NAME;
結果:
First Last
--------------- ---------------
Daniel Faviet
Ismael Sciarra
John Chen
Jose Manuel Urman
Luis Popp
Nancy Greenberg
6 rows selected.
SUBSTRファンクションは、引数として、文字列、文字の位置および長さを受け取り、文字列内の指定された位置から始まる指定された長さの部分文字列を返します。
例4-24の問合せは、SUBSTRを使用して、FIRST_NAMEを頭文字に短縮し、PHONE_NUMBERから地域コードを取り除きます。
例4-24 文字データからの部分文字列の抽出
SELECT SUBSTR(FIRST_NAME, 1, 1) || '. ' || LAST_NAME "Name", SUBSTR(PHONE_NUMBER, 5, 8) "Phone" FROM EMPLOYEES WHERE DEPARTMENT_ID = 100 ORDER BY LAST_NAME;
結果:
Name Phone ---------------------------- -------- J. Chen 124.4269 D. Faviet 124.4169 N. Greenberg 124.4569 L. Popp 124.4567 I. Sciarra 124.4369 J. Urman 124.4469 6 rows selected.
REPLACEファンクションは、ある部分文字列を他の文字列に置き換えます。
例4-25の問合せは、WHERE句でSUBSTRファンクションを使用して、JOB_IDが'SH'で始まる従業員を選択し、さらに、それらの各JOB_IDでREPLACEファンクションを使用して、'SH'を'SHIPPING'に置き換えます。
例4-25 文字データの部分文字列の置換
COLUMN "Job" FORMAT A15; SELECT LAST_NAME, REPLACE(JOB_ID, 'SH', 'SHIPPING') "Job" FROM EMPLOYEES WHERE SUBSTR(JOB_ID, 1, 2) = 'SH' ORDER BY LAST_NAME;
結果:
LAST_NAME Job ------------------------- --------------- Bell SHIPPING_CLERK Bull SHIPPING_CLERK Cabrio SHIPPING_CLERK Chung SHIPPING_CLERK Dellinger SHIPPING_CLERK Dilly SHIPPING_CLERK Everett SHIPPING_CLERK Feeney SHIPPING_CLERK Fleaur SHIPPING_CLERK Gates SHIPPING_CLERK Geoni SHIPPING_CLERK LAST_NAME Job ------------------------- --------------- Grant SHIPPING_CLERK Jones SHIPPING_CLERK McCain SHIPPING_CLERK OConnell SHIPPING_CLERK Perkins SHIPPING_CLERK Sarchand SHIPPING_CLERK Sullivan SHIPPING_CLERK Taylor SHIPPING_CLERK Walsh SHIPPING_CLERK 20 rows selected.
|
参照: SQL文字ファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
日付ファンクションは、日付、タイムスタンプおよび間隔値を操作します。各日付ファンクションは、評価される各行に対し、値を1つ返します。SQLがサポートする日付ファンクションのリストと説明については、『Oracle Database SQL言語リファレンス』を参照してください。
例4-26を理解するには、JOB_HISTORY表を理解する必要があります。
従業員の役職が変更されるとき、これまでの役職のSTART_DATEおよびEND_DATEがJOB_HISTORY表に記録されます。2回以上、役職が変更となった従業員は、次の問合せと結果が示すように、JOB_HISTORY表に複数の行があります。
SELECT * FROM JOB_HISTORY ORDER BY EMPLOYEE_ID;
結果:
EMPLOYEE_ID START_DAT END_DATE JOB_ID DEPARTMENT_ID
----------- --------- --------- ---------- -------------
101 21-SEP-97 27-OCT-01 AC_ACCOUNT 110
101 28-OCT-01 15-MAR-05 AC_MGR 110
102 13-JAN-01 24-JUL-06 IT_PROG 60
114 24-MAR-06 31-DEC-07 ST_CLERK 50
122 01-JAN-07 31-DEC-07 ST_CLERK 50
176 24-MAR-06 31-DEC-06 SA_REP 80
176 01-JAN-07 31-DEC-07 SA_MAN 80
200 17-SEP-95 17-JUN-01 AD_ASST 90
200 01-JUL-02 31-DEC-06 AC_ACCOUNT 90
201 17-FEB-04 19-DEC-07 MK_REP 20
10 rows selected.
例4-26の問合せは、MONTHS_BETWEENファンクションを使用して、各従業員が従来の役職に就いていた月数を表示します。MONTHS_BETWEENファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
例4-26 日付間の月数の表示
SELECT e.EMPLOYEE_ID,
e.LAST_NAME,
TRUNC(MONTHS_BETWEEN(j.END_DATE, j.START_DATE)) "Months Worked"
FROM EMPLOYEES e, JOB_HISTORY j
WHERE e.EMPLOYEE_ID = j.EMPLOYEE_ID
ORDER BY "Months Worked";
結果:
EMPLOYEE_ID LAST_NAME Months Worked
----------- ------------------------- -------------
176 Taylor 9
122 Kaufling 11
176 Taylor 11
114 Raphaely 21
101 Kochhar 40
201 Hartstein 46
101 Kochhar 49
200 Whalen 53
102 De Haan 66
200 Whalen 69
10 rows selected.
例4-27の問合せは、EXTRACTおよびSYSDATEファンクションを使用して、部門100の各従業員が何年間雇用されているかを表示します。 SYSDATEファンクションは、システム・クロックの現在日時を返します。SYSDATEファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。EXTRACTファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
例4-27 日付間の年数の表示
SELECT LAST_NAME,
(EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM HIRE_DATE)) "Years Employed"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY "Years Employed";
結果:
LAST_NAME Years Employed ------------------------- -------------- Popp 4 Urman 5 Chen 6 Sciarra 6 Greenberg 9 Faviet 9 6 rows selected.
従業員は、雇用された月の月末に最初の小切手を受け取るものとします。例4-28の問合せは、LAST_DAYファンクションを使用して、部門100の各従業員の最初の給料日を表示します。LAST_DAYファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
例4-28 選択された月の最後の日の表示
SELECT LAST_NAME,
HIRE_DATE "Hired",
LAST_DAY(HIRE_DATE) "Paid"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY HIRE_DATE;
結果:
LAST_NAME Hired Paid ------------------------- --------- --------- Faviet 16-AUG-02 31-AUG-02 Greenberg 17-AUG-02 31-AUG-02 Chen 28-SEP-05 30-SEP-05 Sciarra 30-SEP-05 30-SEP-05 Urman 07-MAR-06 31-MAR-06 Popp 07-DEC-07 31-DEC-07 6 rows selected.
雇用された従業員は、6か月後に最初の評価を受け取るものとします。例4-29の問合せは、ADD_MONTHSファンクションを使用して、部門100の各従業員の最初の評価日を表示します。ADD_MONTHSファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
例4-29 選択された日から6か月後の日の表示
SELECT LAST_NAME,
HIRE_DATE "Hired",
ADD_MONTHS(HIRE_DATE, 6) "Evaluated"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY HIRE_DATE;
結果:
LAST_NAME Hired Evaluated ------------------------- --------- --------- Faviet 16-AUG-02 16-FEB-03 Greenberg 17-AUG-02 17-FEB-03 Chen 28-SEP-05 28-MAR-06 Sciarra 30-SEP-05 31-MAR-06 Urman 07-MAR-06 07-SEP-06 Popp 07-DEC-07 07-JUN-08 6 rows selected.
例4-30の問合せは、SYSTIMESTAMPファンクションを使用して、現在のシステム時間と日付を表示します。 SYSTIMESTAMPはSYSDATEと似ていますが、より詳しい情報を返します。SYSTIMESTAMPファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
問合せのFROM句内のDUAL表は、Oracle Database XEがデータ・ディクショナリとともに自動的に作成する1行の表です。 SELECT文を使用して定数式を計算する場合は、DUALから選択します。 DUALには行が1つしかないため、定数が返されるのは1回のみです。DUALからの選択の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
例4-30 システム日付および時間の表示
SELECT EXTRACT(HOUR FROM SYSTIMESTAMP) || ':' || EXTRACT(MINUTE FROM SYSTIMESTAMP) || ':' || ROUND(EXTRACT(SECOND FROM SYSTIMESTAMP), 0) || ', ' || EXTRACT(MONTH FROM SYSTIMESTAMP) || '/' || EXTRACT(DAY FROM SYSTIMESTAMP) || '/' || EXTRACT(YEAR FROM SYSTIMESTAMP) "System Time and Date" FROM DUAL;
結果は、現在のSYSTIMESTAMPの値に依存しますが、次の形式で表示されます。
System Time and Date ------------------------------------------------------------------- 18:47:33, 6/19/2008
|
参照: SQL日付ファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
変換ファンクションは、あるデータ型を他のデータ型に変換します。SQLがサポートする変換ファンクションのリストと説明については、『Oracle Database SQL言語リファレンス』を参照してください。
例4-31の問合せは、TO_CHARファンクションを使用して、HIRE_DATE値(DATE型)をFMMonth DD YYYY書式の文字値に変換します。 FMは、月名から先頭と末尾の空白を削除します。 FMMonth DD YYYYは、日付時間書式モデルの一例です。
例4-31 日付から文字列への書式テンプレートを使用した変換
SELECT LAST_NAME,
HIRE_DATE,
TO_CHAR(HIRE_DATE, 'FMMonth DD YYYY') "Date Started"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;
結果:
LAST_NAME HIRE_DATE Date Started ------------------------- --------- ----------------- Chen 28-SEP-05 September 28 2005 Faviet 16-AUG-02 August 16 2002 Greenberg 17-AUG-02 August 17 2002 Popp 07-DEC-07 December 7 2007 Sciarra 30-SEP-05 September 30 2005 Urman 07-MAR-06 March 7 2006 6 rows selected.
例4-32の問合せは、TO_CHARファンクションを使用して、HIRE_DATE値をDS(短い日付)およびDL(長い日付)の2つの標準書式の文字値に変換します。
例4-32 日付から文字への標準書式を使用した変換
SELECT LAST_NAME, TO_CHAR(HIRE_DATE, 'DS') "Short Date", TO_CHAR(HIRE_DATE, 'DL') "Long Date" FROM EMPLOYEES WHERE DEPARTMENT_ID = 100 ORDER BY LAST_NAME;
結果:
LAST_NAME Short Date Long Date ------------------------- ---------- ----------------------------- Chen 9/28/2005 Sunday, September 28, 2005 Faviet 8/16/2002 Tuesday, August 16, 2002 Greenberg 8/17/2002 Wednesday, August 17, 2002 Popp 12/7/2007 Tuesday, December 07, 2007 Sciarra 9/30/2005 Tuesday, September 30, 2005 Urman 3/7/2006 Saturday, March 07, 2006 6 rows selected.
例4-33の問合せは、TO_CHARファンクションを使用して、SALARY値(NUMBER型)を$99,999.99の書式を持つ文字値に変換します。
例4-33 数値から文字列への書式テンプレートを使用した変換
SELECT LAST_NAME,
TO_CHAR(SALARY, '$99,999.99') "Salary"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY SALARY;
結果:
LAST_NAME Salary ------------------------- ----------- Popp $6,900.00 Sciarra $7,700.00 Urman $7,800.00 Chen $8,200.00 Faviet $9,000.00 Greenberg $12,000.00 6 rows selected.
例4-34の問合せは、TO_NUMBERファンクションを使用して、POSTAL_CODE値(VARCHAR2型)を、計算で使用するNUMBER型の値に変換します。
例4-34 文字列から数値への変換
SELECT CITY,
POSTAL_CODE "Old Code",
TO_NUMBER(POSTAL_CODE) + 1 "New Code"
FROM LOCATIONS
WHERE COUNTRY_ID = 'US'
ORDER BY POSTAL_CODE;
結果:
CITY Old Code New Code ------------------------------ ------------ ---------- Southlake 26192 26193 South Brunswick 50090 50091 Seattle 98199 98200 South San Francisco 99236 99237 4 rows selected.
例4-35の問合せは、TO_DATEファンクションを使用して、Month dd, YYYY, HH:MI A.M.という書式の文字列をDATE値に変換します。
例4-35 文字列から日付への変換
SELECT TO_DATE('January 5, 2007, 8:43 A.M.', 'Month dd, YYYY, HH:MI A.M.') "Date" FROM DUAL;
結果:
Date --------- 05-JAN-07
例4-36の問合せは、TO_TIMESTAMPファンクションを使用して、DD-Mon-RR HH24:MI:SS.FFという書式の文字列をTIMESTAMP値に変換します。
例4-36 文字列からタイム・スタンプへの変換
SELECT TO_TIMESTAMP('May 5, 2007, 8:43 A.M.', 'Month dd, YYYY, HH:MI A.M.') "Timestamp" FROM DUAL;
結果:
Timestamp ------------------------------------------------------------------------------ 05-MAY-07 08.43.00.000000000 AM
|
参照:
|
集計ファンクションは、行のグループに基づいて、結果行を1つ返します。行のグループは表またはビュー全体です。SQLがサポートする集計ファンクションのリストと説明については、『Oracle Database SQL言語リファレンス』を参照してください。
集計ファンクションは、1つまたは複数の列ごとに問合せ結果をグループ化するGROUP BY句を各グループの結果ともに使用する場合に、特に有効です。
例4-37の問合せは、COUNTファンクションおよびGROUP BY句を使用して、各マネージャに対してレポートする人数を表示します。ワイルドカード文字*は、レコード全体を表します。
例4-37 各グループの行数のカウント
SELECT MANAGER_ID "Manager", COUNT(*) "Number of Reports" FROM EMPLOYEES GROUP BY MANAGER_ID;
結果:
Manager Number of Reports
---------- -----------------
100 14
1
123 8
120 8
121 8
147 6
205 1
108 5
148 6
149 6
201 1
Manager Number of Reports
---------- -----------------
102 1
101 5
114 5
124 8
145 6
146 6
103 4
122 8
19 rows selected.
例4-37は、従業員の1人がマネージャにレポートしないことを示しています。次の問合せは、その従業員の名、姓および役職を選択します。
COLUMN FIRST_NAME FORMAT A10;
COLUMN LAST_NAME FORMAT A10;
COLUMN JOB_TITLE FORMAT A10;
SELECT e.FIRST_NAME,
e.LAST_NAME,
j.JOB_TITLE
FROM EMPLOYEES e, JOBS j
WHERE e.JOB_ID = j.JOB_ID
AND MANAGER_ID IS NULL;
結果:
FIRST_NAME LAST_NAME JOB_TITLE ---------- ---------- ---------- Steven King President
COUNTファンクションは、DISTINCTオプションとともに使用すると、データ・セット内にある個別値の数を表示します。
例4-38の2つの問合せは、全部門数および従業員が存在する部門の数を表示します。
例4-38 セット内の個別値の数のカウント
SELECT COUNT(*) FROM DEPARTMENTS;
結果:
COUNT(*)
----------
27
SELECT COUNT(DISTINCT DEPARTMENT_ID) "Number of Departments"
FROM EMPLOYEES;
結果:
Number of Departments
---------------------
11
例4-39の問合せは、複数の集計ファンクションを使用して、各JOB_IDの給与の統計を表示します。
例4-39 統計情報を得るための集計ファンクションの使用
SELECT JOB_ID, COUNT(*) "#", MIN(SALARY) "Minimum", ROUND(AVG(SALARY), 0) "Average", MEDIAN(SALARY) "Median", MAX(SALARY) "Maximum", ROUND(STDDEV(SALARY)) "Std Dev" FROM EMPLOYEES GROUP BY JOB_ID ORDER BY JOB_ID;
結果:
JOB_ID # Minimum Average Median Maximum Std Dev ---------- ---------- ---------- ---------- ---------- ---------- ---------- AC_ACCOUNT 1 8300 8300 8300 8300 0 AC_MGR 1 12000 12000 12000 12000 0 AD_ASST 1 4400 4400 4400 4400 0 AD_PRES 1 24000 24000 24000 24000 0 AD_VP 2 17000 17000 17000 17000 0 FI_ACCOUNT 5 6900 7920 7800 9000 766 FI_MGR 1 12000 12000 12000 12000 0 HR_REP 1 6500 6500 6500 6500 0 IT_PROG 5 4200 5760 4800 9000 1926 MK_MAN 1 13000 13000 13000 13000 0 MK_REP 1 6000 6000 6000 6000 0 JOB_ID # Minimum Average Median Maximum Std Dev ---------- ---------- ---------- ---------- ---------- ---------- ---------- PR_REP 1 10000 10000 10000 10000 0 PU_CLERK 5 2500 2780 2800 3100 239 PU_MAN 1 11000 11000 11000 11000 0 SA_MAN 5 10500 12200 12000 14000 1525 SA_REP 30 6100 8350 8200 11500 1524 SH_CLERK 20 2500 3215 3100 4200 548 ST_CLERK 20 2100 2785 2700 3600 453 ST_MAN 5 5800 7280 7900 8200 1066 19 rows selected.
指定された条件を集計値が満たす行のみを返す問合せを行うには、HAVING句を使用します。
例4-40の問合せは、毎年$1,000,000を超える額を給与に費やしている部門についてのみ、部門およびその額を表示します。
例4-40 条件を満たす行への集計ファンクションの制限
SELECT DEPARTMENT_ID "Department",
SUM(SALARY*12) "All Salaries"
FROM EMPLOYEES
HAVING SUM(SALARY * 12) >= 1000000
GROUP BY DEPARTMENT_ID;
結果:
Department All Salaries
---------- ------------
50 1876800
80 3654000
RANKファンクションは、ある数の相対的な順序付けランクを返し、PERCENT_RANKファンクションは、ある数の百分率を返します。
例4-41の問合せは、給与$3,000がすべての事務員の中で20番目に高く、百分率では42%であることを示します。
例4-41 グループ内におけるある数のランクと百分率の表示
SELECT RANK(3000) WITHIN GROUP (ORDER BY SALARY DESC) "Rank", ROUND(100 * (PERCENT_RANK(3000) WITHIN GROUP (ORDER BY SALARY DESC)), 0) "Percentile" FROM EMPLOYEES WHERE JOB_ID LIKE '%CLERK';
結果:
Rank Percentile
---------- ----------
20 42
DENSE_RANKファンクションは、RANKファンクションと似ていますが、同じ値はすべて同じランクとなり、ランキングにギャップが発生しません。DENSE_RANKファンクションを使用すると、例4-42が示すように、$3,000は事務員の12番目に高い給与となります。
例4-42 グループ内におけるある数の稠密ランクの表示
SELECT DENSE_RANK(3000) WITHIN GROUP (ORDER BY salary DESC) "Rank"
FROM EMPLOYEES
WHERE JOB_ID LIKE '%CLERK';
結果:
Rank
----------
12
|
参照: SQL集計ファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
NULL関連ファンクションは、NULL値の処理を容易にします。SQLがサポートするNULL関連ファンクションのリストと説明については、『Oracle Database SQL言語リファレンス』を参照してください。
例4-43の問合せは、姓がBで始まる従業員の姓と歩合を返します。従業員が歩合を受け取らない場合(つまり、COMMISSION_PCTがNULLの場合)、NVLファンクションは、NULLを"Not Applicable"で置換します。
例4-43 文字列によるNULL値の置換
SELECT LAST_NAME,
NVL(TO_CHAR(COMMISSION_PCT), 'Not Applicable') "COMMISSION"
FROM EMPLOYEES
WHERE LAST_NAME LIKE 'B%'
ORDER BY LAST_NAME;
結果:
LAST_NAME COMMISSION ------------------------- ---------------------------------------- Baer Not Applicable Baida Not Applicable Banda .1 Bates .15 Bell Not Applicable Bernstein .25 Bissot Not Applicable Bloom .2 Bull Not Applicable 9 rows selected.
例4-44の問合せは、NVL2ファンクションを使用して、姓がBで始まる従業員の姓、給与および収入を返します。COMMISSION_PCTがNULLでない場合、収入は給与と歩合の合計であり、COMMISSION_PCTがNULLの場合、収入は給与のみです。
例4-44 NULL値と非NULL値に対する異なる式の指定
SELECT LAST_NAME, SALARY,
NVL2(COMMISSION_PCT, SALARY + (SALARY * COMMISSION_PCT), SALARY) INCOME
FROM EMPLOYEES WHERE LAST_NAME LIKE 'B%'
ORDER BY LAST_NAME;
結果:
LAST_NAME SALARY INCOME ------------------------- ---------- ---------- Baer 10000 10000 Baida 2900 2900 Banda 6200 6882 Bates 7300 8468 Bell 4000 4000 Bernstein 9500 11970 Bissot 3300 3300 Bloom 10000 12100 Bull 4100 4100 9 rows selected.
|
参照:
|
CASE式を使用すると、プロシージャを起動することなく、SQL文においてIF ... THEN ... ELSEロジックを使用できます。
例4-45の問合せは、CASE式を使用して、勤続年数に基づいて推奨される給与の値上げを表示します。
例4-45 問合せにおけるCASE式の使用
SELECT LAST_NAME "Name", HIRE_DATE "Started", SALARY "Salary", CASE WHEN HIRE_DATE < TO_DATE('01-Jan-90') THEN TRUNC(SALARY*1.15, 0) WHEN HIRE_DATE < TO_DATE('01-Jan-95') THEN TRUNC(SALARY*1.10, 0) WHEN HIRE_DATE < TO_DATE('01-Jan-00') THEN TRUNC(SALARY*1.05, 0) ELSE SALARY END "Proposed Salary" FROM EMPLOYEES WHERE DEPARTMENT_ID = 100 ORDER BY HIRE_DATE;
結果:
Name Started Salary Proposed Salary ------------------------- --------- ---------- --------------- Faviet 16-AUG-02 9000 9000 Greenberg 17-AUG-02 12008 12008 Chen 28-SEP-05 8200 8200 Sciarra 30-SEP-05 7700 7700 Urman 07-MAR-06 7800 7800 Popp 07-DEC-07 6900 6900 6 rows selected.
DECODEファンクションは、値または式を検索値と対比し、一致を検出した場合に結果を戻します。一致が検出されない場合、DECODEファンクションは、デフォルト値またはNULL(デフォルト値が指定されていない場合)を戻します。
例4-46の問合せは、DECODEファンクションを使用して、3つの異なる役職に対して推奨される給与の値上げを表示します。
例4-46 問合せにおけるDECODEファンクションの使用
SELECT LAST_NAME, JOB_ID, SALARY, DECODE(JOB_ID, 'PU_CLERK', SALARY * 1.10, 'SH_CLERK', SALARY * 1.15, 'ST_CLERK', SALARY * 1.20, SALARY) "Proposed Salary" FROM EMPLOYEES WHERE JOB_ID LIKE '%_CLERK' AND LAST_NAME < 'E' ORDER BY LAST_NAME;
結果:
LAST_NAME JOB_ID SALARY Proposed Salary ------------------------- ---------- ---------- --------------- Atkinson ST_CLERK 2800 3360 Baida PU_CLERK 2900 3190 Bell SH_CLERK 4000 4600 Bissot ST_CLERK 3300 3960 Bull SH_CLERK 4100 4715 Cabrio SH_CLERK 3000 3450 Chung SH_CLERK 3800 4370 Colmenares PU_CLERK 2500 2750 Davies ST_CLERK 3100 3720 Dellinger SH_CLERK 3400 3910 Dilly SH_CLERK 3600 4140 11 rows selected.
|
参照: DECODEファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |