Wyodrębnij nazwę tabeli za pomocą SQL z kolumny, która przechowuje zapytania
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
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
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;