2016-04-07 2 views
1

Ich habe eine Tabelle namens "test", die folgende Struktur hat.SQL-Abfrage zu Zeile in mehrere Zeilen basierend auf einem Trennzeichen zu brechen

category  key             value  
name   real_name:Brad,nick_name:Brady,name_type:small  NOVALUE 
other   description           cool 

Aber ich will key Spalte in mehrere Zeilen brechen basierend auf , Trennzeichen und den Wert nach : Trennzeichen sollte ein Teil der Wertspalte, wo Wert auf NOVALUE gleich ist. So sollte eine Ausgabe wie folgt aussehen:

category  key    value 
name   real_name   Brad 
name   nick_name   Brady 
name   name_type   small 
other   description  cool  

Wie sql Abfrage für diese zu schreiben. Ich benutze postgresql.

Irgendwelche Hilfe? Danke im Voraus.

+0

Ich will nicht nur eine Zeichenfolge in mehrere Spalten auf einige Trennzeichen basiert aufzuspalten. Stattdessen möchte ich basierend auf einem Begrenzer in mehrere Zeilen einteilen und dann jede Zeile basierend auf einem anderen Begrenzer in mehrere Spalten aufteilen. –

+0

Sie sollten nicht in erster Linie abgegrenzte Werte speichern –

Antwort

1

Sie können string_to_array verwenden und UNNEST dies zu tun:

select ts.category, 
     split_part(key_value, ':', 1) as key, 
     split_part(key_value, ':', 2) as value 
from test ts 
    cross join lateral unnest(string_to_array(ts.key, ',')) as t (key_value) 
where ts.value = 'NOVALUE' 

union all 

select category, 
     key, 
     value 
from test 
where value <> 'NOVALUE'; 

SQLFiddle Beispiel: http://sqlfiddle.com/#!15/6f1e6/1

+0

Danke Mann, U sind ein Genie. Ich habe getestet, das ist genau das, was ich wollte. Danke noch einmal. –

+0

Hi @a_horse_with_no_name, ich habe die Frage ein wenig geändert. Ich weiß nicht, ob es dumm ist, dich wieder zu fragen oder nicht, aber ich kämpfe darum. und es muss schnell sein, also möchte ich nicht viel Zeit damit verbringen. Könnten Sie mir bitte dabei helfen? Vielen Dank. –

+0

@Rajeevkumar: Es ist nicht nett, die Frage zu ändern, nachdem Sie eine Antwort erhalten haben. Ich habe meine Antwort aktualisiert –

0
select category, 
     split_part(key_value, ':', 1) as key, 
     case when value = 'NOVALUE' then split_part(key_value, ':', 2) else value end 
from test 
    cross join lateral unnest(string_to_array(key, ',')) as t (key_value) 
+1

Während dieser Code die Frage beantworten kann, zusätzliche Kontext in Bezug auf _why_ und/oder _how_ es Antworten die Frage würde deutlich verbessern seine langfristige Wert. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erklärung hinzuzufügen. –

Verwandte Themen