2017-07-13 4 views
-2

Ich möchte alle Tabellennamen aus dieser SQL-Teilabfrage extrahieren. Bitte beachten Sie, dass ich durch die Linie diese Linie gerade lese, nicht als eine Zeichenfolge:Extrahieren von Tabellennamen aus mehreren Zeichenfolgen mit Perl regex

from DS_RAN_CORID t1, NAMON_GNS t4, NA_VAL_ROL t6, A_TI_G_V t7, PTSM_TCR t2 
left outer join T_TR_COR_LAG t3 
on t2.inp_seq = t3.inp_seq and t3.ti_number = t2.ti_number 
left outer join OUT_TR_COR t5 
on t2.inp_seq=t5.inp_seq and t5.ti_number=t2.ti_number 
where t1.inp_seq = t2.inp_seq and t2.ti_number = t6.interval_number and 
     t1.ti_grp = t7.dm_group and t2.ti_number = t7.interval_number; 

Die Tabellen i extrahieren müssen: DS_RAN_CORID/ NAMON_GNS/ NA_VAL_ROL/ A_TI_G_V/ PTSM_TCR/ T_TR_COR_LAG/ OUT_TR_COR/

Ich versuchte dies:

  1. Spiel der t1. , t2. usw., für jeden Buchstaben und jede Ziffer:

    $string=~m/(\S).\d/gi;

  2. Unter der Annahme, dass mein Code korrekt ist, muss ich mit so etwas wie dies die t1. mit TABLE_NAME t1 und extrahieren den Tabellennamen vergleichen:

    $string=~m/\w+\s+(S)\d/gi;

Antwort

1

Ich dachte SQL::Parser könnte helfen, aber es Drosseln auf dem SQL. Ich bin das hier als Bezugspunkt zu verlassen:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use SQL::Parser; 

my $sql = <<SQL; 
select * 
from DS_RAN_CORID t1, NAMON_GNS t4, NA_VAL_ROL t6, A_TI_G_V t7, PTSM_TCR t2 
left outer join T_TR_COR_LAG t3 
on t2.inp_seq = t3.inp_seq and t3.ti_number = t2.ti_number 
left outer join OUT_TR_COR t5 
on t2.inp_seq=t5.inp_seq and t5.ti_number=t2.ti_number 
where t1.inp_seq = t2.inp_seq and t2.ti_number = t6.interval_number and 
     t1.ti_grp = t7.dm_group and t2.ti_number = t7.interval_number; 
SQL 

my $parser = SQL::Parser->new; 
$parser->dialect('MySQL'); 

die unless $parser->parse($sql); 

print "$_\n" for @{ $parser->structure->{table_names} }; 

Wie für reguläre Ausdrücke verwenden, werde ich beachten, dass alle Tabellennamen erscheinen von Großbuchstaben ASCII bestehen und unterstreichen:

my (%tables) = reverse ($sql =~ /([A-Z][A-Z_]+) \s+ (t[1-9])/gx); 
print Dump \%tables; 
--- 
t1: DS_RAN_CORID 
t2: PTSM_TCR 
t3: T_TR_COR_LAG 
t4: NAMON_GNS 
t5: OUT_TR_COR 
t6: NA_VAL_ROL 
t7: A_TI_G_V 
+0

Du hast zu viele Tische gegriffen. Einige davon stammen vom JOIN und nicht nur von der FROM-Klausel. – CDahn

+0

Verwenden des Moduls SQL: Parser sieht so einfach aus, ich bin neu in Perl und habe noch nie ein Modul benutzt. Kannst du das erklären:% tables, warum benutzt man einen Hash und nicht ein @array? Und warum revers() verwenden? –

+0

@CDahn Ich brauche die Tabelle auch nach JOIN, JOIN ist nach dem FROM, ich brauche alle Tabellen, die diesem Muster entsprechen NAME_OF_THE_TABLE tn, wobei n mindestens 1 ist. –

Verwandte Themen