2016-07-10 5 views
0

Ich habe ein Problem mit der Übertragung von "echten" Daten in mein Schema. Es ist eigentlich ein "Projekt" für meinen Datenbankkurs und sie gaben uns einen Tisch mit Hunderennen. Diese Tabelle enthält eine Spalte, die den Namen des Hundes (der wiederum aus dem tatsächlichen Namen und dem Namen des Züchters besteht) und Informationen über das Geburtsland, das tatsächliche lebende Land und das Geburtsjahr enthält. Beispiel eingereicht sind "Lillycette [AU 2012]" oder "Black Bear Lee [AU/AU 2013]" oder "Lemon Ralph [IE/UK 1998]". Ich habe es geschafft, das erste Wort aus und es in der rechten Spalte mit split_part wie folgt speichern:SELECT mittleren Teil eines String, wenn es existiert. Postgresql

INSERT INTO tblHund (rufname) 
SELECT 
    split_part(name, ' ', 1) AS rufname, 
FROM tblimport; 

tblimport ist eine Tabelle, wo ich die Daten aus der CSV-Datei ausgegeben. Das funktioniert genauso wie es sollte. Zugriff auf den zweiten Teil des Namens mit diesem fehlschlägt, weil manchmal gibt es keinen zweiten Teil und manchmal gibt es zweiten Teil besteht aus zwei Wörtern.

Und das ist der Ort, an dem ich gerade feststeckte. Ich versuchte es mit Teilzeichenfolge und regulären Ausdrücken:

INSERT INTO tblZwinger (Name) 
SELECT 
    substring(vatertier from E'[^ ]*\\ (+)$')AS Name 
FROM tblimport 
WHERE substring(vatertier from E'[^ ]*\\ (+)$') != ''; 

Der obige Code fehlerfrei ausgeführt wird, aber eigentlich tut nichts, weil die SELECT-Anweisung nur leere Strings zurück geben.

Ich brauchte mehr als 3h, um ein bisschen von diesen regulären Ausdrücken zu verstehen, aber ich fühle mich immer noch ziemlich dumm, wenn ich sie anschaue.

Gibt es eine andere Möglichkeit, dies zu tun. Wenn ja, gib mir einen Hinweis. Wenn nicht, was ist falsch mit meinem Ausdruck oben?

Danke für Ihre Hilfe.

Antwort

0

Sie benötigen . Atom zu verwenden, die innerhalb Erfassung Gruppe jedes einzelne Zeichen übereinstimmt:

E'[^ ]*\\ (.+)$' 
0
SELECT 
    tblimport.*, 
    ti.parts[1] as f1, 
    ti.parts[2] as f2, -- It should be the "middle part" 
    ti.parts[3] as f3 
FROM 
    tblimport, 
    regexp_matches(tblimport.vatertier, '([^\s]+)\s*(.*)\s+\[(.*)\]') as ti(parts) 
WHERE 
    nullif(ti.parts[2], '') is not null 

Etwas wie oben.

Verwandte Themen