Tuesday, August 18, 2009

İKİ NOKTA ARASINDAKİ KARAKTER KÜMESİNİ ALMA

Bugün aşağıdaki sorguya ihtiyaç duydum belki ileride birdun sizinde işinize ayrayabilir. Aslında ben sadece nokta(.) karakterine göre kıyaslama yaptım ama siz bunu değiştirebilirsiniz (-) , ( _ ) gibi değişikl karaketerler yapabilirsiniz.

SELECT Substr (i.proc_name,
--ilk noktanın konumunu aldım
(Regexp_instr (i.proc_name, '[:.:]', 1, 1, 0, 'i') + 1),
--ikinci noktanın konumundan ilk noktanın konumunu çıkarakak iki nokta arasında kaç karakter olduğunu buluyorum.
(Regexp_instr (i.proc_name, '[:.:]', 1, 2, 0, 'i')
- Regexp_instr (i.proc_name, '[:.:]', 1, 1, 0, 'i') - 1
) ) package_name
FROM paket_isim_tablom i

--group by ile tekrar eden kayıtları ekliyorum. Çünkü bir pakette birden fazla procedere olduğu için tekrarlamalar sözkonusu oluyor.
GROUP BY Substr (i.proc_name, (Regexp_instr (i.proc_name, '[:.:]', 1, 1, 0, 'i') + 1),
(Regexp_instr (i.proc_name, '[:.:]', 1, 2, 0, 'i')
- Regexp_instr (i.proc_name, '[:.:]', 1, 1, 0, 'i') - 1
) )
ORDER BY 1


buradaki seneryoda paket_isim_tablom da proce_name alanında schema.packege.procederu şeklinde bir karaketer katarım var. Ben buradan package name çıakrtmak için yukarıdaki sql'i kullanabilirim.

ÖRNEK BİR KULLANIM

/* Formatted on 2009/08/18 11:24 (Formatter Plus v4.8.8) */
SELECT Substr ('HR.PAKET_ADI.PROCEDURE_ADI',
( Regexp_instr ('HR.PAKET_ADI.PROCEDURE_ADI',
'[:.:]',
1,
1,
0,
'i'
)
+ 1
),
( Regexp_instr ('HR.PAKET_ADI.PROCEDURE_ADI',
'[:.:]',
1,
2,
0,
'i'
)
- Regexp_instr ('HR.PAKET_ADI.PROCEDURE_ADI',
'[:.:]',
1,
1,
0,
'i'
)
- 1
)
)
FROM dual;

SUBSTR('H
---------
PAKET_ADI


1 row selected.

No comments: