2017-10-21 4 views
0

Ich möchte die folgende Zeichenfolge in Stadt, Provinz, Postleitzahl teilen. Vielen Dank für die Hilfe !!!!SQL - re.split: BY Komma THEN Leerzeichen

Beschreibung: Durch Komma teilen, dann nur einmal durch Leerzeichen trennen.

A = 'Vaughan, ON L6D 9X0' 

Ergebnis:

(Vaughan, ON, L6D9X0) 

Versuch:

re.split(',|/s[1]', A) 
+1

Tag der RDBMS (MySQL, MS SQL Server, Orcale, etc ...), die Sie verwenden. –

Antwort

0

IF, Sie arbeiten mit MicrosoftSQL Server, dann könnte man SUBSTRING() & CHARINDEX() Funktion spezifisch finden verwenden Char Index, um die string Werte zu teilen.

SELECT SUBSTRING(<column>, 1, CHARINDEX(',', <column>)-1) City, 
     SUBSTRING(SUBSTRING(<column>, CHARINDEX(' ', <column>)+1, LEN(<column>)), 1, CHARINDEX(' ', SUBSTRING(<column>, CHARINDEX(' ', <column>)+1, LEN(<column>)))) Province, 
     SUBSTRING(SUBSTRING(<column>, CHARINDEX(' ', <column>)+1, LEN(<column>)), CHARINDEX(' ', SUBSTRING(<column>, CHARINDEX(' ', <column>)+1, LEN(<column>)))+1, LEN(<column>)) [Postal Code]; 

gewünschte Ausgabe:

City  Province Postal Code 
Vaughan ON   L6D 9X0 
0

Das Versuchen,

Diese ausgewählt, um die Werte in Zeilen, vielleicht können Sie Dreh der CTE C2 gleichen, um es zu bekommen als Spalten

WITH CTE 
AS 
(
    SELECT 
    1 Seq, 
    'Vaughan, ON L6D 9X0' "Txt" 

    UNION ALL 

    SELECT 
    Seq+1 "Seq", 
    Txt = CASE WHEN Txt LIKE '% %' 
       THEN LTRIM(RTRIM(SUBSTRING(Txt,CHARINDEX(' ',Txt),LEN(Txt)))) 
      ELSE NULL END 
    FROM CTE 
     WHERE ISNULL(txt,'')<>'' 
),C2 
AS 
(
SELECT 
    CASE Seq 
    WHEN 1 THEN 'City' 
    WHEN 2 THEN 'Province' 
    ELSE 'PostalCode' END "Head", 
    CASE Seq 
    WHEN 1 
     THEN SUBSTRING(Txt,1,CHARINDEX(',',Txt)-1) 
    WHEN 2 
     THEN SUBSTRING(Txt,1,CHARINDEX(' ',Txt)-1) 
    ELSE Txt END "Txt" 
    FROM CTE 
    WHERE Seq<4 
) 
SELECT 
    * 
    FROM C2; 

Wenn Sie mehrere Zeilen haben, die auf die gleiche Weise geparst werden müssen, können Sie dasselbe in der SELECT-Anweisung des 1. CTE angeben. In diesem Fall muss möglicherweise die Logik für Seq bei der ersten Auswahl geändert werden. Gemäß der oben wird der Ausgang als

Sample Output

0

Mit Postgres folgt Sie, dass die Verwendung tun können:

select split_part(a, ',', 1) as city, 
     left(trim(split_part(a,',',2)), strpos(trim(split_part(a,',',2)), ' ')), 
     substr(trim(split_part(a,',',2)) as province, strpos(trim(split_part(a,',',2)), ' ') + 1) as postal_code 
from the_table; 

Das ist ein bisschen mehr lesbar durch die Verwendung einer abgeleiteten Tabelle gemacht werden kann:

select city, 
     left(second_part, strpos(second_part, ' ')) as province, 
     substr(second_part, strpos(second_part, ' ') + 1) as postal_code 
from (
    select split_part(a, ',', 1) as city, 
     trim(split_part(a, ',', 2)) as second_part 
    from the_table 
) t