Ekstrak nama tabel menggunakan SQL dari kolom yang menyimpan kueri

Dec 09 2020

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

2 esqew Dec 09 2020 at 02:18

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

access_granted Dec 09 2020 at 02:49

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;