繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM