#6 DECODE CASE

2669 ワード

2021.12.21 🔆きれいに跳び越す
序曲
今日はSELECTにWHERE以外の条件を追加できる条件文DECODEとCASEについて学びました.
DECODE
  • 同等(=)条件で使用する関数
  • 構文
  • DECODE(A、B、True、False):A=BはTrue A≠BはFalse
  • を表す
  • DECODE(A, B, B_true, C, C_true , false) :
    --A=Bの場合、B true
    --A=Cの場合、C true
    --A≠B,A≠Cの場合false
  • DECODE(A, B, DECODE(A2, B2, B2_true), B_false)
    --A=B,A2=B2,B2 true
    --A=B,A2≠B2,null
    --A≠Bの場合、B false
  • CASE
  • 複数の条件(<、>、>=、<=、=)を扱う関数
  • 構文
  • CASE変数
    WHEN値1 THEN結果1:変数=値1であれば結果1
    WHEN値2 THEN結果2:変数≠値1;変数=値2なら結果2
    ELSE結果3:以上のすべての値を満たすことができなければ結果3
    END;
  • CASE
    WHEN条件式1 THEN結果1:条件式1が真であれば結果1
    WHEN条件式2 THEN結果2:条件式1は偽、条件式2は真の結果2
    ELSE結果3:以上のすべての条件式を満たすことができなければ結果3
    END;
  • DECODE,CASE例
    1.タイトルは「サッカー」「野球」「バスケットボール」「ゴルフ」に関する本は「球技種目」、フィギュアスケートに関する本は「スケート」、ウエイトリフティングに関する本は「体操」、その他すべての本は「スポーツ」が出力する「種目」欄で、本号、本名、出版社、種目を印刷する
    SELECT bookid, bookname, publisher,
    CASE
    WHEN(bookname LIKE'%サッカー')
    OR bookname LIKE'%野球%'
    OR bookname LIKE'%バスケットボール%'
    OR bookname LIKE「%ゴルフ%」)THEN「球技種目」
    WHEN bookname LIKE'%フィギュアスケート%'THENスケート'
    WHEN bookname LIKE'%重量挙げ%'THEN体操'
    MELSE「その他」
    END「プロジェクト」
    FROM book;
    2.すべての本の平均値以上の本は「平均値以上」、「空未満」の「平均値」欄を作成し、書名、価格、平均値を出力する
    SELECT bookname, price,
    CASE
    WHEN price>=(SELECT AVG(price)FROM book)THEN「均価以上」
    ELSE null
    END「均価」
    FROM book;
    3、本の価格が10000元以下の本は、1000元を高める;超えた本は、価格が変わらず、書名、価格、変動価格で出力する
    SELECT bookname, price,
    CASE
    WHEN price <= 10000 THEN price+1000
    ELSE price
    END「可変価格」
    FROM book;
    4.電話番号のあるお客様、「専用」のないお客様は、お客様のすべての情報を入力して出力する必要があります.
    SELECT c.*,
    DECODE(phone、null、「入力が必要」、「非公開」)
    FROM customer c;
    5.注文明細に割引がある本には「割引」、価格が変わらない本には「変わらない」印刷欄、印刷書名、出版社、価格、販売価格、割引明細
    SELECT bookname ,publisher, price, saleprice,
    CASE
    WHEN(price-saleprice)>0 THEN「割引」
    WHEN(price-saleprice)=0 THEN「不変」
    MELSE「その他」
    END
    FROM book b, orders o
    WHERE b.bookid = o.bookid;
    6.購入履歴のあるお客様にクーポンを提供し、購入履歴のないお客様には提供しない「クーポン」欄を作成し、「提供」「未提供」をお客様名、クーポン欄として出力する
    SELECT a.name、「クーポン」
    FROM
    (SELECT c.name,
    CASE
    WHEN o.orderid is null THEN「未提供」
    MELSE「交付」
    END「クーポン」
    FROM orders o, customer c
    WHERE o.custid(+) = c.custid) a
    GROUP BY a.name、「クーポン」;
    7.注文が3回以上のお客様は「ベストメンバー」、2回は「優秀メンバー」、1回は「一般メンバー」、0回は「潜在顧客」の「会員資格」欄を作成し、氏名を印刷する
    SELECT c.custid, c.name,
    CASE
    WHEN count()>=3 THEN「ベストメンバー」
    WHEN count()=2 THEN「優秀会員」
    WHEN count(*) = 1 THEN (CASE
    WHEN MAX(o.orderid)は空THEN「潜在顧客」
    MELSE「一般メンバー」
    END)
    ENDメンバーシップ
    FROM orders o, customer c
    WHERE o.custid(+) = c.custid
    GROUP BY c.custid, c.name;