Извлечь имя таблицы с помощью SQL из столбца, в котором хранятся запросы
В таблице хранятся запросы, и мне нужно извлечь имя таблицы из этих запросов.
таблица: главная
Я БЫ | querytext |
---|---|
1 | выберите a.record_id, a.name, b.person FROM database.atable a join database.btable b на b.id = a.id; |
2 | выберите c.record_id, c.name, d.person FROM database.ctable c присоединиться к database.dtable d на c.id = d.id; |
Ожидаемые результаты:
database.atable
database.ctable
SELECT SUBSTR(querytext, position('database.' in querytext), 30) FROM main;
Это почти работает, но я не знаю, насколько длинным или коротким может быть имя таблицы. Если он больше 30, это обрезает результаты. Если короче, он может включать другие части запроса. Я читал strtok и думал о том, чтобы использовать его, чтобы добраться до места после имени, чтобы остановиться, но не мог заставить его работать.
Ответы
Похоже, это может быть хорошим вариантом использования для REGEXP_SUBSTR:
SELECT REGEXP_SUBSTR(querytext, '(<?FROM database\.)(.+?\b)', 1, 1, 'i')
Шаблон ищет строковый литерал, FROM database.
который непосредственно предшествует имени таблицы, соответствующему шаблону (.+?\b)
.
Далее - шаблон (.+?\b)
соответствует любым символам ( .
), встречающимся по крайней мере один раз ( +
) не жадно ( ?
токен), вплоть до символа границы слова ( \b
), который, судя по вашим образцам данных, должен совпадать с пробелом, непосредственно следующим за именем таблицы.
Вы можете увидеть, как этот шаблон интерпретируется еще более подробно, используя такую утилиту, как Regex101 .
Дальнейшее (хотя и немного касательное) чтение, касающееся поддержки RegExp в стиле PCRE в Teradata: синтаксис Regex в тераданных
Немного напуганный, но должен работать:
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;