pl/sql delimited list oluşturmak

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page

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…

PaylaşTweet about this on TwitterShare on FacebookEmail this to someoneShare on Google+Share on LinkedInShare on TumblrShare on RedditPin on PinterestDigg thisFlattr the authorShare on StumbleUponBuffer this page
PL/SQL ile birden fazla kaydı tek satırda getirmek (lag over() lead over())
Pivot/Unpivot işlemleri

Your comments

Loading Facebook Comments ...

Leave a Reply