使用 SQL 从存储查询的列中提取 table 名称

Extract table name using SQL from a column that stores queries

A table 在其中存储查询,我需要从这些查询中提取 tablename。

table:主要

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;

这几乎行得通,但我不知道 table 名称可以有多长或多短。如果超过 30,则会截断结果。如果更短,它可以包括查询的其他部分。我正在阅读 strtok 并考虑使用它来到达停止名称后的 space,但无法完全正常工作。

这似乎是 REGEXP_SUBSTR 的一个很好的用例:

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

该模式查找紧接在匹配模式 (.+?\b).

的 table 名称之前的字符串文字 FROM database.

进一步-模式(.+?\b)匹配至少出现一次(+)的任何字符(.)非贪婪(?令牌)最多单词边界字符 (\b),根据您的样本数据判断,应该匹配紧跟 table 名称的空白。

您可以使用 Regex101.

等实用程序更详细地了解如何解释此模式

关于 Teradata 中 PCRE 式 RegExp 支持的进一步(虽然略微切题)阅读:Regex syntax in teradata

看起来有点古怪,但应该有用:

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;