クエリを格納する列からSQLを使用してテーブル名を抽出します

Dec 09 2020

テーブルにはクエリが格納されているので、それらのクエリからテーブル名を抽出する必要があります。

table:main

ID querytext
1 select a.record_id、a.name、b.person FROM database.atable a join database.btable b on b.id = a.id;
2 select c.record_id、c.name、d.person FROM database.ctable c join database.dtable d on c.id = d.id;

期待される結果:

database.atable
database.ctable

SELECT SUBSTR(querytext, position('database.' in querytext), 30) FROM main;

これはほぼ機能しますが、テーブル名の長さや短さはわかりません。30より長い場合、結果が切り捨てられます。短い場合は、クエリの他の部分が含まれる可能性があります。私はstrtokを読んでいて、それを使って名前の後のスペースに移動することを考えましたが、うまく機能させることができませんでした。

回答

2 esqew Dec 09 2020 at 02:18

このように思われるREGEXP_SUBSTR:の良いユースケースかもしれません:

SELECT REGEXP_SUBSTR(querytext, '(<?FROM database\.)(.+?\b)', 1, 1, 'i')

パターンはFROM database.、パターンに一致するテーブル名の直前にある文字列リテラルを探します(.+?\b)

さらに、パターンは、単語境界文字()まで、少なくとも1回()非貪欲(トークン)で出現する(.+?\b)すべての文字(.)と一致します。これは、サンプルデータから判断すると、テーブル名の直後の空白で一致する必要があります。+?\b

Regex101などのユーティリティを使用して、このパターンがどのように解釈されるかをさらに詳しく確認できます。


TeradataでのPCREスタイルのRegExpサポートに関するさらなる(わずかに接線的ではありますが)読み物:teradataでの正規表現構文

access_granted Dec 09 2020 at 02:49

少しファンキーに見えますが、機能するはずです:

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;

またはあなたの場合

select strtok( 
  substr( querytext, index(querytext,'FROM ')+length('FROM '), length(querytext)) 
  ,' ', 1 
  ) from main;