Extraia o nome da tabela usando SQL de uma coluna que armazena consultas
Uma tabela armazena consultas nela e eu preciso extrair o tablename dessas consultas.
mesa: principal
EU IA | texto de consulta |
---|---|
1 | selecione a.record_id, a.name, b.person FROM database.atable a join database.btable b on b.id = a.id; |
2 | selecione c.record_id, c.name, d.person FROM database.ctable c join database.dtable d em c.id = d.id; |
Resultados esperados:
database.atable
database.ctable
SELECT SUBSTR(querytext, position('database.' in querytext), 30) FROM main;
Isso quase funciona, mas não sei quão longo ou curto o nome da tabela poderia ser. Se for maior que 30, os resultados serão interrompidos. Se for mais curto, pode incluir outras partes da consulta. Eu estava lendo strtok e pensei em usar isso para chegar ao espaço após o nome parar, mas não conseguia fazer funcionar.
Respostas
Parece que este pode ser um bom caso de uso para REGEXP_SUBSTR:
SELECT REGEXP_SUBSTR(querytext, '(<?FROM database\.)(.+?\b)', 1, 1, 'i')
O padrão procura pelo literal de string FROM database.
que precede imediatamente um nome de tabela que corresponda ao padrão (.+?\b)
.
Além disso - o padrão (.+?\b)
corresponde a qualquer caractere ( .
) ocorrendo pelo menos uma vez ( +
) sem avidez ( ?
token) até um caractere de limite de palavra ( \b
), que, a julgar pelos seus dados de amostra, deve corresponder no espaço em branco imediatamente após o nome da tabela.
Você pode ver como esse padrão é interpretado com ainda mais detalhes usando um utilitário como o Regex101 .
Leitura adicional (embora ligeiramente tangencial) em relação ao suporte RegExp de estilo PCRE no Teradata: sintaxe Regex em teradata
Parece um pouco descolado, mas deve funcionar:
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;
ou no seu caso
select strtok(
substr( querytext, index(querytext,'FROM ')+length('FROM '), length(querytext))
,' ', 1
) from main;