2016-06-23 9 views
1

Ich habe Liste der Datenbanken und Tabellen wie folgt erhalten:Teradata REGEXP_SIMILAR genaue String-Matching

SELECT TRIM(DatabaseName) || '.' || TRIM(TableName) AS DatabaseTable 
FROM DBC.TablesV t1 
WHERE TableKind IN ('T','O','V') 

Ich möchte jetzt, sie zu dbc.TablesV.RequestText passen eine Hierarchie meiner Datenbankansichten zu bauen. Zuerst habe ich es mit einfachen verbinden wie unten

JOIN DBC.TablesV t2 
ON t2.RequestText LIKE '%' || DatabaseTable || '%' 

aber leider haben wir Tabellen wie T1010_User und T1010_User_Hist und Datenbanken wie DB_STAGE und Q_DB_STAGE so habe ich beschlossen, Räume% auf LIKE-Klausel hinzuzufügen, so dass es LIKE '% ' || DatabaseTable || ' %' aber dann scheitert es richtige Ergebnisse zu erhalten, weil manchmal Tabellenname name~~POS=HEADCOMP am Ende eines request ist wie folgt: (...) DB_STAGE.TableName; und manchmal ist es wie folgt aus:

(...) 
FROM 
DB_STAGE.TableName t1 
(...) 

entschied ich mich REGEXP_SIMILAR zu verwenden, um sie mit WHEN REGEXP_SIMILAR() = 1 b übereinstimmen ut meine regex-fu schwach ist, so kann ich nicht regex bauen, die so etwas wie tun:

((anything other than a letter/number) or nothing) DatabaseTable ((anything other than a letter/number) or nothing) 

Dies ist Hierarchie der Ansichten zu bauen mit Migration von Daten in eine andere Datenbank zu helfen.

Dies ist sehr vereinfachten Fall:

CREATE VOLATILE TABLE test1 
(
c0 SMALLINT, 
c1 varchar(100) 
)ON COMMIT PRESERVE ROWS; 

INSERT INTO test1 VALUES(1,'aaa 
Q_abcdef.abcdef'); 
INSERT INTO test1 VALUES(2,' Q_abcdef.abcdef '); 
INSERT INTO test1 VALUES(3,'aaa 
DQ_abcdef.abcdef '); 
INSERT INTO test1 VALUES(4,' S_abcdef.abcdef'); 
INSERT INTO test1 VALUES(5,'Q_abcdef.abcdefg'); 
INSERT INTO test1 VALUES(6,' sdfs 
Q_abcdef.abcdefg'); 
INSERT INTO test1 VALUES(DQ_abcdef,' 7.abcdefg'); 
INSERT INTO test1 VALUES(8,' S_abcdef.abcdefg'); 
INSERT INTO test1 VALUES(9,'Q_abcdef.abcdef;'); 
INSERT INTO test1 VALUES(10,' Q_abcdef.abcdef;'); 
INSERT INTO test1 VALUES(11,'DQ_abcdef.abcdef;'); 
INSERT INTO test1 VALUES(12,' S_abcdef.abcdef;'); 

Ich brauche 1 zu entsprechen, 2, 9 und 10 diejenigen, die Zeichenfolge Q_abcdef.abcdef genau haben.

Antwort

0

können Sie \b verwenden zum Anpassen Wortgrenzen:

WHERE REGEXP_SIMILAR (c1, '.*\bQ_abcdef.abcdef\b.*', 'i') = 1 

Diese nicht 5 & 6 zurück, weil es nicht ist g

+0

Oh ins Finale durch passende, mein schlecht. 5 und 6 sind falsch, das ist wahrscheinlich was ich will. Vielen Dank (bearbeitete Hauptfrage). –