2016-05-05 7 views
4

DB2-Version ist 9.7.0.7Validate Daten vor der Konvertierung, aka. ISDATE() entspricht

Ich habe eine Flat-Datei und muss vor dem Einfügen in eine Produktionstabelle vollständig validieren. Zur Analyse habe ich es in eine Tabelle geparst, in der alle Spalten VARCHAR sind.

Eine der Aufgaben besteht darin, Daten zu validieren. Ich muss in der Lage sein, die spezifischen ungültigen Daten zu finden, um über den Umfang (Häufigkeit) und die Lösung (Grund) zu berichten.

Ich verwende ISDATE() in Sybase und SQL Server, die eine 1 für ein gültiges Datum und eine 0 für ein ungültiges Datum zurückgibt. In Teradata verließ ich mich auf die Tabelle SYS_CALENDAR im Systemkatalog. Es ist ungefähr 15 Jahre her, seit ich das letzte Mal in einer DB2-Umgebung war, aber ich glaube, Analoga gibt es entweder nicht. In dieser DB2-Umgebung ist meine Rolle auf QA beschränkt, was bedeutet, dass ich keine T-SQL-Prozeduren oder UDFs erstellen kann.

Dieser Thread ist klug und lässt mich denken, dass eine gemeinsame Logik Tabellenausdruck sein können, die in einer Abfrage verwendet werden könnten: ISDATE equivalent of DB2

Dass man fällt kurz als Lösung, aber, weil es Format nur betrachtet - Das Vorhandensein eines ungültigen (aber korrekt formatierten) Datums wie "2016-04-31" oder "2016-02-30" führt zu einem Fehler und die Abfrage gibt keine Zeilen zurück.

Ich muss alle Zeilen zurückgeben, identifizieren, ob jeder gültig oder ungültig ist t arbeiten.

Gibt es eine Analog-ISDATE(), SYS_CALENDAR oder eine andere Lösung, die auf das gleiche Endprodukt einer zeilenweise Darstellung der Daten bekommt, das nicht zu DATE gegossen werden kann, vor, dass die Umwandlung der Durchführung/einfügen?

+0

Wenn Sie eine Möglichkeit, dies zu tun in einer gespeicherten Prozedur bestimmen könnte, dann würde die Sache sei ein "Werkzeug für den Job" -Problem, das du mit denen, die dich bezahlen, aufnehmen könntest. –

+1

Sie können eine zusammengesetzte SQL-Anweisung (manchmal als anonymer Block bezeichnet) ausführen, ohne eine Routine zu erstellen. Also, ja, es gibt eine Lösung. – mustaccio

Antwort

1

Sie können es mit dem PureXML Erweiterung wie folgt vorgehen:

SELECT 
XMLCAST(XMLQUERY('string($D) castable as xs:date' PASSING mycolumn as D) AS INT) 
FROM 
mytable 

welche zurückkehren 1 oder 0

+1

Ordentlich! Ich sollte wahrscheinlich darauf hinweisen, dass pureXML keine Erweiterung, sondern ein Teil der DB2-Abfrageverarbeitungs-Engine ist. – mustaccio

+0

Danke, ich muss das hier lesen - etwas Neues zu lernen! Sieht auf jeden Fall einfach und effizient aus - hoffentlich keine Leistungseinbuße - und ich bin mir momentan nicht sicher, wie das DBMS ist - wenn das nur eine Präsentationsschicht ist, oder könnte es trotzdem einen DBMS-Fehler geben? Ich werde darüber nachlesen, danke! – geolemon

+0

Dies funktioniert meist, aber das Ergebnis zeigt diese lange Zeichenfolge, anstatt nur "falsch" oder "wahr" - " False" Das Präfix ist unnötig, aber ich kann keine Dokumentation finden, die den String erklärt oder ihn unterdrückt. Ich könnte LOCATE und SUBSTR, aber nur wenn nötig. Vielen Dank! – geolemon

Verwandte Themen