pl/sql delimited list oluşturmak
Her yazılımcının(!) mutlaka karşılaşmış olduğu (ya da henüz karşılaşmamış ama karşılaşacağı (: ) bir sorgu çeşididir.
Tablomuz şu şekilde;
Birkaç yöntem var bunları sırasıyla yazmaya çalışacağım faydalı olur umarım…
- wm_concat
- LISTAGG
- XMLTYPE.getstringval XMLAGG XMLFOREST
Bu yöntemler ile sorunumuzu çözebiliriz. DBMS_UTILITY.table_to_comma fonksiyon olarak kullanılabilen bir yöntem diğerlerine nispeten biraz daha zahmetli bir syntax’ı var. Aslında bunun birde DBMS_UTILITY.comma_to_table versiyonu var.
Her yönteme kısaca değinmeye çalışacağım.
WM_CONCAT: wmsys scheması altında kullanılabilen bir fonksiyondur. Yani user lock durumda ise
ALTER USER wmsys ACCOUNT UNLOCK IDENTIFIED BY <password>;
Şeklinde önce bu kullanıcıyı unlock ediyoruz.
Kullanımı diğer yöntemlere göre oldukça kolay tek satırda istediğimiz sonucu alıyoruz 🙂
SELECT a.country_id country_code, WMSYS.WM_CONCAT (a.city) cities
FROM locations a
GROUP BY a.country_id
LISTAGG: 11gR2 ile gelen bir özellik. Kullanımı da WM_CONCAT kadar basit detaylarina fazla girmeyeceğim bu yazıda ama WM_CONCAT’a göre daha güzel kullanım şekilleri var…
SELECT a.country_id country_code, LISTAGG (a.city, ‘,’) cities
FROM locations a
GROUP BY a.country_id
‘,’ yerine istediğiniz karakteri yazarsınız artık. LISTAGG (a.city, ‘,’) WITHIN GROUP (ORDER BY a.location_id) şeklinde elde ettiğimiz kayıt kümesini belirli bir kritere göre sıralı getirmekte mümkün.
XMLTYPE.getstringval XMLAGG XMLFOREST: Biraz karmaşık bir sorgu özellikle listagg ve wm_concat’e göre…
SELECT a.country_id,
SUBSTR (
REPLACE (
REPLACE (
XMLTYPE.getstringval (XMLAGG (XMLFOREST (a.city AS m))),
‘<M>’,
‘, ‘
),
‘</M>’,
”
),
2
)
cities
FROM locations a
GROUP BY a.country_id
Aslında tam olarak amacımıza hizmet eden bir sorgu değil. Replace ile istediğimizi elde etmiş oluyoruz sadece…
Umarım işinize yarar…