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.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment