2017-10-31 9 views
0

Ich versuche, alle Tabellen zu finden, deren Name mit yyyy_mm_dd endet, zB temp_2017_10_01, alpha_2016_11_02.Überprüfen, ob der Tabellenname das Datum enthält

Zur Zeit versuche ich, dies zu tun:

SELECT table_name 
FROM information_Schema.tables 
WHERE table_name LIKE '%2017_%' 
OR table_name LIKE '%2016_%' 
OR table_name LIKE '%2015_%' 

Was ist eine elegante Weise, dies zu tun?

Antwort

2

Sie könnten versuchen, regex wie mit:

SELECT table_name 
FROM information_Schema.tables 
WHERE table_name ~* '201[567]_.*' 

Dies würde nach Jahren 2015 2016 und 2017. Wenn Sie ein allgemeineres Muster finden, wollte ein beliebiges Datum Sie diese verwenden:

SELECT table_name 
FROM information_Schema.tables 
WHERE table_name ~* '[0-9]{4}_[0-9]{2}_[0-9]{2}' 

Genau genommen ist das obige Muster jetzt zu allgemein, weil es Dinge wie 9999_99_99 erlaubt, die keine gültigen Daten sind. Aber ich schätze, das ist gut genug für Ihren Anwendungsfall, weil Sie nicht versuchen, Tabellennamen zu validieren, sondern sie einfach zu extrahieren.

+0

, aber das erfordert Intervention zu einem bestimmten Zeitpunkt, zB wenn ich 2018 hinzufügen möchte. Gibt es einen allgemeineren Weg? – nish

+0

@nish Verwenden Sie eine umfassendere Regex –

0

Versuchen Sie, diese: wenn verwendet folgenden alle Funktionen in der jeweiligen Datenbank zur Verfügung stehen, wie es in SQL SERVEROR fein arbeitet man äquivalente Funktion statt

SELECT table_name 
FROM information_Schema.tables 
WHERE ISDATE(REPLACE(RIGHT(table_name, 10), '_', '-')) = 1 
0

Sie können so etwas wie diese verwenden können. mit einfachen substr und to_date Funktionen, wird überall funktionieren.

SELECT table_name 
FROM information_Schema.tables WHERE To_Date(SubStr(table_name,Length(table_name)-9,4)||'-'||SubStr(table_name,Length(table_name)-4,2)||'-'||SubStr(table_name,Length(table_name)-1,2),'YYYY-MM-DD') BETWEEN To_Date('01-JAN-2016') AND To_Date('31-DEC-2016'); 

gibt Ihnen alle Tabellen zwischen 1. Januar 2016 und 31. Dezember 2016 und Sie können einfach den gewünschten Bereich ersetzen. Wenn Sie alle möchten, dann können Sie einfach '01 -JAN-1950 'und '31-DEC-3000' geben, um sicher zu sein, dass Sie alle bekommen können;)

Verwandte Themen