Extraia o nome da tabela usando SQL de uma coluna que armazena consultas

Dec 09 2020

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

2 esqew Dec 09 2020 at 02:18

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

access_granted Dec 09 2020 at 02:49

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;