Thursday, June 11, 2009

DB2 LIKE predicate

        บ่อยครั้งที่เราใช้ keyword LIKE ในการ select ข้อมูลจาก Database แบบ wildcard หลายๆคนคงคุ้นเคยกันดี แต่วันนี้ผมขอมาแนะนำการใช้งาน keyword LIKE ของ DB2 อีกครั้ง ลองดูกันนะครับว่ามีอะไรน่าสนใจบ้าง
>------------- LIKE ------------ pattern ----------------------------------->
                                     |                                                          |
                                     ----- ESCAPE --------- pattern ----


โดย escape character ของ LIKE ใน DB2 คือ

1. % มีค่าเท่ากับตัวอักษรอะไรก็ได้จำนวน 0 หรือมากว่า
2. _  มีค่าเท่ากับตัวอักษรอะไรก็ได้จำนวน 1 ตัว

ตัวอย่างเช่น

 
DATA    
 ---------- 
 X    
 XX_  
 XXX

SELECT * FROM TABLE WHERE DATA LIKE 'X%'
        SQL statement ข้างต้นหมายความว่า จะเอา DATA ทุกตัวที่ขึ้นต้นด้วย X ขึ้นมาแสดงผล ดังนั้นผลลัพธ์จาก SQL statement นี้จะได้ เป็น X, XX_, XXX   

SELECT * FROM TABLE WHERE DATA LIKE 'XX%'
        SQL statement ข้างต้นหมายความว่า จะเอา DATA ทุกตัวที่ขึ้นต้นด้วย XX ขึ้นมาแสดงผล ดังนั้นผลลัพธ์จาก SQL statement นี้จะได้ เป็น XX_, XXX   

SELECT * FROM TABLE WHERE DATA LIKE '%X'
        SQL statement ข้างต้นหมายความว่า จะเอา DATA ทุกตัวที่ลงท้ายด้วย X ขึ้นมาแสดงผล ดังนั้นผลลัพธ์จาก SQL statement นี้จะได้ เป็น X, XXX   

SELECT * FROM TABLE WHERE DATA LIKE 'XX_'
SQL statement ข้างต้นหมายความว่า จะเอา DATA ทุกตัวที่ขึ้นต้นด้วย XX และลงท้ายด้วยอะไรก็ได้ 1 ตัวขึ้นมาแสดงผล ดังนั้นผลลัพธ์จาก SQL statement นี้จะได้ เป็น XX_, XXX

SELECT * FROM TABLE WHERE DATA LIKE '_'
        SQL statement ข้างต้นหมายความว่า จะเอา DATA ทุกตัวที่มีตัวอักษรอะไรก็ได้ 1 ตัวขึ้นมาแสดงผล ดังนั้นผลลัพธ์จาก SQL statement นี้จะได้ เป็น X

        มาถึงตรงนี้ถ้าเราต้องการให้ XX_ เท่านั้นขึ้นมาแสดงล่ะครับต้องทำไง ????
คำตอบคือเราต้องใช้ keyword เพิ่มเติมครับคือ ESCAPE เนื่องจาก _ เป็น escape character ของ LIKE ดังที่กล่าวไว้แล้วข้างต้น
        เอาล่ะครับ มาดูวิธีการใช้ ESCAPE กันต่อเลย

        การใช้นั้นไม่ยากครับ DB2 จะมองว่าอักขระทุกตัวที่อยู่เป็นคู่กับ อักขระที่ระบุไว้ใน ESCAPE เป็นอักขระที่ต้องการความหมายนั้นจริงๆ จะไม่นำไปใช้ในความหมายอื่นๆ
ดังตัวอย่างต่อไปนี้ครับ

SELECT * FROM TABLE WHERE DATA LIKE 'XX+_' ESCAPE '+'
        หมายความว่าอักขระอะไรคู่กับเครื่องหมาย + อักขระนั้น DB2 จะมองว่าเป็นอักขระจริงๆ ง่ายๆก็คือว่าถ้า _ อยู่หลัง + ก็จะถูกมองว่าเป็น _ ไม่ใช้ ตัวอักษรอะไรก็ได้หนึ่งตัวดังนั้น ผลลัพธ์ของ SQL statement นี้ก็จะได้เป็น  XX_ ตามที่เราต้องการ หรือเราอาจจะใช้อักขระอื่นในการทำเป็นคู่ของอักขระพิเศษก็ได้ครับ ที่เป็นแบบนี้เพราะให้เราสามารถใส่ตัวอักษรใน LIKE ได้หลากหลายขึ้น เพราะถ้า DB2 กำหนดว่าอะไรตามหลังบวกจะมองว่าเป็นอักขระจริงๆ แล้วถ้าเราต้องการ select ข้อมูลที่มี + ละต้องทำยังไง ++ ? อันนี้อาจจะทำให้ดูยาก เอาล่ะครับ นั้นหมายความว่าเราถ้าเราใช้ SQL statement ต่อไปนี้ ก็จะได้ผลลัพธ์เป็น XX_ เหมือนกัน

SELECT * FROM TABLE WHERE DATA LIKE 'XXa_' ESCAPE 'a'



No comments: