Extraiga el nombre de la tabla usando SQL de una columna que almacena consultas

Dec 09 2020

Una tabla almacena consultas en ella y necesito extraer el nombre de la tabla de esas consultas.

tabla: principal

IDENTIFICACIÓN texto de consulta
1 seleccione a.record_id, a.name, b.person FROM database.atable a join database.btable b on b.id = a.id;
2 seleccione c.record_id, c.name, d.person FROM database.ctable c unirse a database.dtable d en c.id = d.id;

Resultados previstos:

database.atable
database.ctable

SELECT SUBSTR(querytext, position('database.' in querytext), 30) FROM main;

Esto casi funciona, pero no sé qué tan largo o corto podría ser el nombre de la tabla. Si es más largo que 30, cortará los resultados. Si es más corto, podría incluir otras partes de la consulta. Estaba leyendo strtok y pensé en usar eso para llegar al espacio después del nombre para detener, pero no pude hacerlo funcionar.

Respuestas

2 esqew Dec 09 2020 at 02:18

Parece que este podría ser un buen caso de uso para REGEXP_SUBSTR:

SELECT REGEXP_SUBSTR(querytext, '(<?FROM database\.)(.+?\b)', 1, 1, 'i')

El patrón busca el literal de cadena FROM database.que precede inmediatamente a un nombre de tabla que coincide con el patrón (.+?\b).

Además, el patrón (.+?\b)coincide con cualquier carácter ( .) que ocurra al menos una vez ( +) sin codicia ( ?token) hasta un carácter de límite de palabra ( \b), que a juzgar por sus datos de muestra, debe coincidir en el espacio en blanco inmediatamente antes del nombre de la tabla.

Puede ver cómo se interpreta este patrón con aún más detalle utilizando una utilidad como Regex101 .


Lectura adicional (aunque ligeramente tangencial) sobre el soporte de RegExp de estilo PCRE en Teradata: sintaxis Regex en teradata

access_granted Dec 09 2020 at 02:49

Un poco de aspecto funky, pero debería 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;

o en tu caso

select strtok( 
  substr( querytext, index(querytext,'FROM ')+length('FROM '), length(querytext)) 
  ,' ', 1 
  ) from main;