Wyodrębnij nazwę tabeli za pomocą SQL z kolumny, która przechowuje zapytania

Dec 09 2020

Tabela przechowuje w niej zapytania i muszę wyodrębnić nazwę tabeli z tych zapytań.

tabela: główna

ID tekst zapytania
1 wybierz a.record_id, a.name, b.person Z bazy danych.atable a join database.btable b on b.id = a.id;
2 wybierz c.record_id, c.name, d.person Z bazy danych.ctable c dołącz do bazy danych.dtable d na c.id = d.id;

Oczekiwane rezultaty:

database.atable
database.ctable

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

To prawie działa, ale nie wiem, jak długa lub krótka może być nazwa tabeli. Jeśli jest dłuższy niż 30, odetnie wyniki. Jeśli jest krótsza, może obejmować inne części zapytania. Czytałem strtok i myślałem o użyciu tego, aby dostać się do miejsca po nazwie, aby się zatrzymać, ale nie mogłem go uruchomić.

Odpowiedzi

2 esqew Dec 09 2020 at 02:18

Wygląda na to, że może to być dobry przypadek użycia dla REGEXP_SUBSTR:

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

Wzorzec szuka literału ciągu, FROM database.który bezpośrednio poprzedza nazwę tabeli pasującą do wzorca (.+?\b).

Co więcej - wzorzec (.+?\b)dopasowuje dowolne znaki ( .) występujące co najmniej raz ( +) nie chciwie ( ?token) aż do znaku granicy słowa ( \b), który sądząc po danych przykładowych, powinien pasować do białej spacji bezpośrednio poprzedzającej nazwę tabeli.

Możesz zobaczyć, jak ten wzorzec jest interpretowany bardziej szczegółowo za pomocą narzędzia takiego jak Regex101 .


Dalsze (choć nieco styczne) czytanie dotyczące obsługi RegExp w stylu PCRE w Teradata: składnia Regex w teradata

access_granted Dec 09 2020 at 02:49

Trochę dziwnie wyglądający, ale powinien działać:

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;

lub w twoim przypadku

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