使用 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;
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)
.
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;