Extraiga el nombre de la tabla usando SQL de una columna que almacena consultas
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
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
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;