2017-01-04 3 views
-1

Ich habe eine Tabelle zu normalisieren, die Foo den Spaltennamen besteht & Bar, wo Foo eine eindeutige Kennung und Leiste enthält getrennte Mehrwerte von ~Wie ein Multi-Werte in einem einzigen Feld (SQL)

Foo Bar 
1 A~B~ 
2 A~C~D 

ich brauche es als solche normiert werden:

Foo Bar 
1 A 
1 B 
2 A 
2 C 
2 D 

Während ich es von Excel durch TEXT-Säule Trennung gefolgt durch Schwenken tun können, ist es nicht machbar, da ich Million über Datensätze 1 und Bar Spalte enthalten kann bis zu 12 verschiedenen Werten.

Gibt es einen einfachen Weg, den ich direkt aus SQL manipulieren könnte?

+2

was RDBMS verwenden Sie? Zum Beispiel könnte eine Antwort für mySql anders sein als eine Antwort für Sql-Server. Bitte bearbeiten Sie Ihre Frage, um die relevante Datenbank und die relevante Version, mit der Sie arbeiten, einzuschließen. –

+0

Entschuldigung. Ich benutze T-SQL – Jim

Antwort

0

Danke allen. Das folgende Skript funktioniert wunderbar, obwohl ich XML oder die Logik nicht verstehe.

SELECT A.FOO,
Split.a.value (' ' 'VARCHAR (100)') als Daten
VON
( SELECT FOO,
CAST ('' + REPLACE (BAR , ',', '') + '' AS XML) AS Daten
FROM Tabelle1 ) ALS KREUZANMELDUNG Data.nodes ('/ M') AS Split (a);

Referenz: Turning a Comma Separated string into individual rows

1

Sie haben hier eine Standard 1 zu viele Beziehung. Du hast also 1 Foo zu vielen Bars. Sie müssen also Ihre Daten hier in der 2. Normalform halten (2NF).

Hier ist ein SO veröffentlichen Erklärung der beste Weg, um die String-Spalte Wert in Zeilen wie Sie teilen möchten: Turning a Comma Separated string into individual rows

1

Sie nicht Ihre DBMS angegeben haben, so ist dies für Postgres:

select t.foo, b.bar 
from the_table t, 
    unnest(string_to_array(t.bar, '~')) as b(bar); 
Verwandte Themen