1

一个表在其中存储查询,我需要从这些查询中提取表名。

表:主要

ID 查询文本
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 并考虑使用它来到达名称后的空格以停止,但不能完全让它工作。

4

2 回答 2

2

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

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

FROM database.该模式查找紧接在与该模式匹配的表名之前的字符串文字(.+?\b)

此外 - 该模式(.+?\b)匹配.至少一次(+)非贪婪(?令牌)出现的任何字符()直到单词边界字符(\b),根据您的示例数据判断,该字符应该匹配紧接在表名之后的空格。

您可以使用Regex101 之类的实用程序更详细地了解如何解释此模式。


有关 Teradata 中 PCRE 样式 RegExp 支持的进一步(尽管有点切题)阅读: teradata 中的正则表达式语法

于 2020-12-08T19:18:03.943 回答
0

看起来有点时髦,但应该可以:

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;
于 2020-12-08T19:49:37.427 回答