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;

Location TableElde etmek istediğimiz sonuç;

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…

PL/SQL ile birden fazla kaydı tek satırda getirmek (lag over() lead over())
Pivot/Unpivot işlemleri

Leave a Reply