SQL etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
SQL etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

11 Ağustos 2016 Perşembe

Bir kolon içerisinde tekrarlayan verinin tekilleştirilmesi (distinct)

Önce
------------------------------
 select group_id,   
     listagg(name, ',') within group (order by name) as names  
 from demotable  
 group by group_id   

 group_id names  
 -------- -----  
 1     'Alan, David, David, John'  
 2     'Charles, Julie'  
Sonra
------------------------------

 select group_id,   
 regexp_replace(  
   listagg(name, ',') within group (order by name)  
   ,'([^,]+)(,\1)+', '\1')  
 from demotable  
 group by group_id;   

 group_id names  
 -------- -----  
 1     'Alan, David, John'  
 2     'Charles, Julie'  

3 Şubat 2016 Çarşamba

Ön tanımlama gerekmeyen cursor loop

Genellikle cursor loop gerektiğinde aşağıdaki yapıyı kullanıyorum.
Hem kod okunurluğunu arttırıyor hem de daha kolay bir kullanımı var.
 DECLARE  
  BEGIN  
  /* Open up a cursor for loop, also selecting  
  * the "p" function which will write rows to  
  * t2 for every row fetched from t1. */  
  FOR crec IN (SELECT tcol, p(tcol) FROM t1) LOOP  
   -- Break out of the loop immediately  
   EXIT;  
  END LOOP;  
 END;  

Daha fazla bilgi için aşağıdaki adresi inceleyebilirsiniz.
http://psoug.org/reference/control_struct.html

Tek satırdaki ve belirli bir ayıraç ile ayrılmış verinin çok satırlı hale dönüştürülmesi(Connect By)

Aşağıda "," ayracı ile ayrılmış olan "abcd,123,defoifcd,87765" verisi
virgülle ayrılmış her bir veri ayrı bir satır olacak şekilde görüntülenmektedir.
 SQL> with t as (select 'abcd,123,defoifcd,87765' as str from dual)  
 select level as n, regexp_substr(str,'[^,]+',1,level) as val  
 from  t  
 connect by regexp_substr(str,'[^,]+',1,level) is not null ;  
      N VAL  
 ---------- ------------------------------  
      1 abcd  
      2 123  
      3 defoifcd  
      4 87765  
 SQL>  

Birden fazla satır içeren verinin tek satırda gösterilmesi (LISTAGG)

 select  
   deptno,  
   listagg (ename, ',')   
 WITHIN GROUP   
 (ORDER BY ename) enames  
 FROM   
   emp  
 GROUP BY   
   deptno  
 /   


Komut çıktısı aşağıdaki gibi olacaktır.
   DEPTNO ENAMES                        
 ---------- --------------------------------------------------  
     10 CLARK,KING,MILLER                   
     20 ADAMS,FORD,JONES,SCOTT,SMITH          
     30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD