[英]Extract table name using SQL from a column that stores queries
一个表在其中存储查询,我需要从这些查询中提取表名。
表:主要
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 并考虑使用它来到达名称后的空格以停止,但不能完全让它工作。
似乎这可能是REGEXP_SUBSTR
的一个很好的用例:
SELECT REGEXP_SUBSTR(querytext, '(<?FROM database\.)(.+?\b)', 1, 1, 'i')
该模式查找字符串文字FROM database.
紧接在匹配模式(.+?\b)
的表名之前。
此外 - 模式(.+?\b)
匹配任何字符 ( .
) 至少出现一次 ( +
) 非贪婪地 ( ?
令牌) 直到单词边界字符 ( \b
),根据您的样本数据判断,应该在紧接表名之后的空格上匹配。
您可以使用Regex101 之类的实用程序更详细地了解如何解释此模式。
有关 Teradata 中 PCRE 样式 RegExp 支持的进一步(尽管有点切题)阅读: 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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.