How Oracle “Case” Functions help your work
พบกันอีกเช่นเคย วันนี้สบายๆไม่มีปัญหาอะไรเกิดขึ้นเรามาเปลี่ยนบรรยากาศด้วยเกล็ดเล็กในการใช้ Case Function กับการ query ครับ โดยปกติการค้นหาข้อมูลก็ต้องมีผลลัพธ์ออกมา และก็เป็นไปได้ที่ว่า “ถ้าผลลัพธ์ได้ A ก็อยากให้แสดงผลแบบนึง แต่ถ้าได้ B ก็ต้องการให้แสดงผลอีกแบบนึง เป็นต้น”
ซึ่ง Oracle มีฟังก์ชันที่ช่วยให้เราสามารถ Query ข้อมูลแล้วแปลงผลลัพธ์ให้ได้อย่างที่เราต้องการได้ง่ายขึ้นด้วย Case Function ซึ่งมีรูปแบบการใช้งานดังนี้
คราวนี้เรามาดูตัวอย่าง เพื่อความกระจ่างในการใช้งานดีกว่าครับ สมมติว่าผมมีตารางเก็บสินค้าคงคลังชื่อ “INVENTSTOCK” โดยมีข้อมูลในตารางดังนี้
สมมติว่าเราต้องการแสดงผลข้อมูลคงคลังของสินค้าโดยดูจากจำนวนสินค้าคงเหลือ ดังนี้
ถ้าสินค้าเหลือ 0 ให้แสดงผลเป็น “out of stock”
ถ้าสินค้าเหลือ 1 – 10 ให้แสดงผลเป็น “need orders”
ถ้าสินค้าเหลือ > 10 ให้แสดงผลเป็น “enough”
เราสามารถใช้ Case Function โดยเลือกฟิลด์ “STOCK” มาพิจารณาใน Case ดังนี้
ซึ่งเราจะได้ผลลัพธ์ดังตัวอย่าง
เป็นยังไงครับเราสามารถแสดงผลได้ด้วย 1 SQL Statement เลย แต่ยังไม่หมดครับ นอกจากการใช้ Column_name มาเข้า Case แบบปกติ เรายังสามารถใช้ +,-,*,/ ได้อีกด้วย ดังตัวอย่างที่ 2
สมมติว่า เรามีตารางที่เก็บจำนวนสินค้าที่มีการสั่งเข้ามาแล้วแต่ยังไม่ได้ทำบัญชี นั่นแสดงว่าเรายังมีสินค้าที่ยังไม่ได้นับรวมอีก อยากจะออกรายงานใหม่โดยเอาจำนวนสินค้าจากอีกตารางมานับรวมด้วย สมมติว่าตารางสินค้าเข้าใหม่ชื่อ INVENTORDER มีข้อมูลดังนี้
เราจะต้องเอาจำนวน NUM_ORDER ของสินค้าไปรวมกับสินค้าคงคลังด้วย เพราะงั้นเราสามารถเปลี่ยน SQL ใหม่ดังนี้
เราจะได้ผลลัพธ์ใหม่ดังนี้
อา…เท่านี้เราก็ได้รายงานตามความเป็นจริงแล้ว แล้วพบกันใหม่ครับ
ซึ่ง Oracle มีฟังก์ชันที่ช่วยให้เราสามารถ Query ข้อมูลแล้วแปลงผลลัพธ์ให้ได้อย่างที่เราต้องการได้ง่ายขึ้นด้วย Case Function ซึ่งมีรูปแบบการใช้งานดังนี้
CASE WHEN (<column_value>= <value>) THEN WHEN (<column_value>= <value>) THEN WHEN … ELSE <value> END |
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 |
สมมติว่า เรามีตารางที่เก็บจำนวนสินค้าที่มีการสั่งเข้ามาแล้วแต่ยังไม่ได้ทำบัญชี นั่นแสดงว่าเรายังมีสินค้าที่ยังไม่ได้นับรวมอีก อยากจะออกรายงานใหม่โดยเอาจำนวนสินค้าจากอีกตารางมานับรวมด้วย สมมติว่าตารางสินค้าเข้าใหม่ชื่อ INVENTORDER มีข้อมูลดังนี้
GOODS_CODE | NUM_ORDER |
F01 | 1 |
F02 | 10 |
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 |
No comments:
Post a Comment