クエリを格納する列から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;