Thursday, October 14, 2010

How Oracle “Case” Functions help your work

 

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_CODESTOCKUPRICE
F010100
F023200
B017300
B020400
T01201400
T02502400
สมมติว่าเราต้องการแสดงผลข้อมูลคงคลังของสินค้าโดยดูจากจำนวนสินค้าคงเหลือ ดังนี้
ถ้าสินค้าเหลือ 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_CODESTOCKREMARK
F010out of stock
F023need order
B017need order
B020out of stock
T0120enough
T0250enough
เป็นยังไงครับเราสามารถแสดงผลได้ด้วย 1 SQL Statement เลย แต่ยังไม่หมดครับ นอกจากการใช้ Column_name มาเข้า Case แบบปกติ เรายังสามารถใช้ +,-,*,/ ได้อีกด้วย ดังตัวอย่างที่ 2
สมมติว่า เรามีตารางที่เก็บจำนวนสินค้าที่มีการสั่งเข้ามาแล้วแต่ยังไม่ได้ทำบัญชี นั่นแสดงว่าเรายังมีสินค้าที่ยังไม่ได้นับรวมอีก อยากจะออกรายงานใหม่โดยเอาจำนวนสินค้าจากอีกตารางมานับรวมด้วย สมมติว่าตารางสินค้าเข้าใหม่ชื่อ INVENTORDER มีข้อมูลดังนี้
GOODS_CODENUM_ORDER
F011
F0210
เราจะต้องเอาจำนวน 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_CODESTOCKORDER_NEWREMARK
F0101need order
F02310enough
B0170need order
B0200out of stock
T01200enough
T02500enough
อา…เท่านี้เราก็ได้รายงานตามความเป็นจริงแล้ว แล้วพบกันใหม่ครับ

No comments:

Post a Comment