Oracle PL/SQL Tips : How Oracle Case Functions help your work

Oracle PL/SQL Tips : How Oracle Case Functions help your work

พบกันอีกเช่นเคย วันนี้สบายๆไม่มีปัญหาอะไรเกิดขึ้นเรามาเปลี่ยนบรรยากาศด้วยเกล็ดเล็กในการใช้ Case Function กับการ query ครับ โดยปกติการค้นหาข้อมูลก็ต้องมีผลลัพธ์ออกมา และก็เป็นไปได้ที่ว่า “ถ้าผลลัพธ์ได้ A ก็อยากให้แสดงผลแบบนึง แต่ถ้าได้ B ก็ต้องการให้แสดงผลอีกแบบนึง เป็นต้น”

ซึ่ง Oracle มีฟังก์ชันที่ช่วยให้เราสามารถ Query ข้อมูลแล้วแปลงผลลัพธ์ให้ได้อย่างที่เราต้องการได้ง่ายขึ้นด้วย Case Function ซึ่งมีรูปแบบการใช้งานดังนี้

CASE WHEN (<column_value>= <value>) THEN            WHEN (<column_value>= <value>) THEN               WHEN …
           ELSE <value>
END

คราวนี้เรามาดูตัวอย่าง เพื่อความกระจ่างในการใช้งานดีกว่าครับ สมมติว่าผมมีตารางเก็บสินค้าคงคลังชื่อ “INVENTSTOCK” โดยมีข้อมูลในตารางดังนี้

GOODS_CODE STOCK UPRICE
F01 0 100
F02 3 200
B01 7 300
B02 0 400
T01 20 1400
T02 50 2400

สมมติว่าเราต้องการแสดงผลข้อมูลคงคลังของสินค้าโดยดูจากจำนวนสินค้าคงเหลือ ดังนี้

ถ้าสินค้าเหลือ 0  ให้แสดงผลเป็น “out of stock”
ถ้าสินค้าเหลือ 1 – 10 ให้แสดงผลเป็น “need orders”
ถ้าสินค้าเหลือ > 10 ให้แสดงผลเป็น “enough”

เราสามารถใช้ Case Function โดยเลือกฟิลด์ “STOCK” มาพิจารณาใน Case ดังนี้

 select  goods_code, stock ,(case when stock = 0 then ‘out of stock’

         when stock between 1 and 10 then ‘need order’

        else ‘enough’

end ) Remark

from inventstock ;

 

ซึ่งเราจะได้ผลลัพธ์ดังตัวอย่าง

GOODS_CODE STOCK REMARK
F01 0 out of stock
F02 3 need order
B01 7 need order
B02 0 out of stock
T01 20 enough
T02 50 enough

เป็นยังไงครับเราสามารถแสดงผลได้ด้วย 1 SQL Statement เลย แต่ยังไม่หมดครับ นอกจากการใช้ Column_name มาเข้า Case แบบปกติ เรายังสามารถใช้ +,-,*,/ ได้อีกด้วย ดังตัวอย่างที่ 2

สมมติว่า เรามีตารางที่เก็บจำนวนสินค้าที่มีการสั่งเข้ามาแล้วแต่ยังไม่ได้ทำบัญชี นั่นแสดงว่าเรายังมีสินค้าที่ยังไม่ได้นับรวมอีก อยากจะออกรายงานใหม่โดยเอาจำนวนสินค้าจากอีกตารางมานับรวมด้วย สมมติว่าตารางสินค้าเข้าใหม่ชื่อ INVENTORDER มีข้อมูลดังนี้

GOODS_CODE NUM_ORDER
F01 1
F02 10

เราจะต้องเอาจำนวน NUM_ORDER ของสินค้าไปรวมกับสินค้าคงคลังด้วย เพราะงั้นเราสามารถเปลี่ยน SQL ใหม่ดังนี้

 select  a.goods_code, a.stock ,nvl(b.num_order,0) order_new,

(case when a.stock + nvl(b.num_order,0) = 0 then ‘out of stock’

        when a.stock + nvl(b.num_order,0) between 1 and 10 then ‘need order’

        else ‘enough’

end) Remark

from inventstock a , inventorder b

where a.goods_code=b.goods_code(+);

 

เราจะได้ผลลัพธ์ใหม่ดังนี้

GOODS_CODE STOCK ORDER_NEW REMARK
F01 0 1 need order
F02 3 10 enough
B01 7 0 need order
B02 0 0 out of stock
T01 20 0 enough
T02 50 0 enough

อา…เท่านี้เราก็ได้รายงานตามความเป็นจริงแล้ว แล้วพบกันใหม่ครับ

You may also like...

Leave a Reply

Your email address will not be published.