Извлечь имя таблицы с помощью SQL из столбца, в котором хранятся запросы

Dec 09 2020

В таблице хранятся запросы, и мне нужно извлечь имя таблицы из этих запросов.

таблица: главная

Я БЫ 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 и думал о том, чтобы использовать его, чтобы добраться до места после имени, чтобы остановиться, но не мог заставить его работать.

Ответы

2 esqew Dec 09 2020 at 02:18

Похоже, это может быть хорошим вариантом использования для REGEXP_SUBSTR:

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

Шаблон ищет строковый литерал, FROM database.который непосредственно предшествует имени таблицы, соответствующему шаблону (.+?\b).

Далее - шаблон (.+?\b)соответствует любым символам ( .), встречающимся по крайней мере один раз ( +) не жадно ( ?токен), вплоть до символа границы слова ( \b), который, судя по вашим образцам данных, должен совпадать с пробелом, непосредственно следующим за именем таблицы.

Вы можете увидеть, как этот шаблон интерпретируется еще более подробно, используя такую ​​утилиту, как Regex101 .


Дальнейшее (хотя и немного касательное) чтение, касающееся поддержки RegExp в стиле PCRE в Teradata: синтаксис Regex в тераданных

access_granted Dec 09 2020 at 02:49

Немного напуганный, но должен работать:

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;