2017-05-22 4 views
0

Ich habe ein Feld in einer Postgres-Tabelle, die wie die folgende Tabelle aussieht. Ich möchte die Zeichenfolge in zwei separate Komponenten basierend auf dem Leerzeichen als Trennzeichen aufteilen. Beachten Sie, dass alle Felder TEXT sind.postgresql 9.5: versuchen, eine Zeichenfolge in zwei Felder basierend auf Leerzeichen zu trennen

tablename: intersection_table_wi 
wwhid 
----- 

"102 5" 
"104 61" 
"103 84" 

Deshalb möchte ich dies so zu einem Ziel konvertieren:

wwhid  wv002  wv003 
-----  -----  ----- 

"102 5" "102"  "5" 
"104 61" "104"  "61" 
"103 84" "103"  "84" 

Das Problem ist, dass, wenn ich die Abfrage schreibe ich immer die Dinge, die wie folgt aussehen:

wwhid  wv002  wv003 
-----  -----  ----- 

"102 5" "102 5" "" 
"104 61" "104 61" "" 
"103 84" "103 84" "" 

Jetzt ist das subtile Problem, dass in einigen Fällen mehr als ein Leerzeichen zwischen den beiden Teilstrings in whhid ist, während in anderen Fällen nur ein Leerzeichen vorhanden ist.

Die Abfrage Ich habe versucht, sind wie folgt:

UPDATE intersection_table_wi 
SET wv002 = SPLIT_PART(BTRIM(whhid), '/\s+', 1), 
wv003 = SPLIT_PART(BTRIM(whhid), '/\s+', 2); 

Kann mir jemand sagen, wie ich diese Abfrage beheben kann das Ziel oben angegeben zu erhalten?

+0

die doppelten Anführungszeichen tatsächlich ein Teil der Daten sind, benötigen aufgeteilt? –

+0

Ja, das sind alles Saiten. So kamen die ursprünglichen Daten. Ich kann eine Umwandlung auf die Variablen anwenden, nachdem sie getrennt wurden, aber aus Gründen des minimalen Beispiels wollte ich es einfach halten. Aber die Antwort ist, dass die Variablen wwhid, wv002, wv003 Text sind. – krishnab

+1

Also * * speichern Sie diese doppelten Anführungszeichen in der Datenbank? –

Antwort

3

split_part() unterstützt keine regulären Ausdrücke. Sie können nur eine "einfache" Zeichenfolge als Trennzeichen angeben.

auf einem regulären Ausdruck Sie regexp_split_to_array()

UPDATE intersection_table_wi 
    SET wv002 = (regexp_split_to_array(BTRIM(whhid), '\s+'))[1], 
     wv003 = (regexp_split_to_array(BTRIM(whhid), '\s+'))[2]; 
+0

Ahh ausgezeichnet. Das hat funktioniert. Danke für den Tipp. Ich wusste nicht, dass 'split_part' keine regulären Ausdrücke verwendet. Ich schätze Ihre Hilfe zu diesem Thema. – krishnab

+0

@krishnab: Beachten Sie auch, dass reguläre Ausdrücke ** nicht mit '/' in Postgres gestartet werden (außer Sie wollen das '/' in die Regex als konstantes Zeichen einschließen) –

+0

Okay, danke. Ich werde verwirrt über die verschiedenen Regex-Dialekte. Das werde ich mir merken. – krishnab

Verwandte Themen