Ekstrak nama tabel menggunakan SQL dari kolom yang menyimpan kueri
Sebuah tabel menyimpan query di dalamnya dan saya perlu mengekstrak nama tablename dari query tersebut.
tabel: utama
Indo | querytext |
---|---|
1 | pilih a.record_id, a.name, b.person FROM database.atable a join database.btable b on b.id = a.id; |
2 | pilih c.record_id, c.name, d.person FROM database.ctable c join database.dtable d on c.id = d.id; |
Hasil yang diharapkan:
database.atable
database.ctable
SELECT SUBSTR(querytext, position('database.' in querytext), 30) FROM main;
Ini hampir berhasil, tetapi saya tidak tahu seberapa panjang atau pendek nama tabel itu. Jika lebih dari 30, itu akan memotong hasil. Jika lebih pendek, itu bisa menyertakan bagian lain dari kueri. Saya sedang membaca strtok dan berpikir tentang menggunakannya untuk pergi ke ruang setelah nama berhenti, tetapi tidak bisa membuatnya berfungsi.
Jawaban
Sepertinya ini kasus penggunaan yang baik untuk REGEXP_SUBSTR:
SELECT REGEXP_SUBSTR(querytext, '(<?FROM database\.)(.+?\b)', 1, 1, 'i')
Pola mencari string literal FROM database.
yang berada tepat di depan tablename yang cocok dengan pola tersebut (.+?\b)
.
Lebih lanjut - pola (.+?\b)
cocok dengan semua karakter ( .
) yang terjadi setidaknya satu kali ( +
) tidak serakah ( ?
token) hingga karakter batas kata ( \b
), yang dilihat dari data sampel Anda, harus cocok dengan spasi langsung yang melanjutkan nama tabel.
Anda dapat melihat bagaimana pola ini diinterpretasikan dengan lebih detail menggunakan utilitas seperti Regex101 .
Bacaan lebih lanjut (meskipun sedikit tangensial) mengenai dukungan RegExp gaya PCRE di Teradata: sintaks Regex di teradata
Sedikit terlihat funky, tetapi seharusnya berhasil:
select
strtok( substr( strsql, index(strsql,'FROM ')+length('FROM '), length(strsql)), ' ', 1 )
from (
select
'select c.record_id, c.name, d.person FROM database.ctable c join database.dtable d on c.id= d.id'
as strsql
) s1;
atau dalam kasus Anda
select strtok(
substr( querytext, index(querytext,'FROM ')+length('FROM '), length(querytext))
,' ', 1
) from main;