Ausgabe
Ok, los geht’s. Mein allererster Beitrag und Frage.
Ich verwende SQL Server 2019. Ich habe eine Tabelle, die an zwei Spalten aus dieser Tabelle interessiert ist.
Beide Spalten enthalten Array-ähnliche Daten (beide sind eine Reihe von Zeichenfolgen, die durch Kommas getrennt sind. Ich möchte jede Teilzeichenfolge aus den Spalten nehmen und sie allein in ihrer eigenen “Zelle” anzeigen und stattdessen viele Zeilen haben.
Jetzt kann ich es mit STRING_SPLIT mit einer der Spalten zum Laufen bringen. Wenn ich jedoch String Split für beide Spalten verwende, bekomme ich nicht die Reihenfolge, die ich brauche. dh zum Beispiel siehe unten
column1: 'my_fav_drink','my_fav_colour','my_fav_avenger'
column2: 'coffee','blue','dr_strange'
Die Position der Zeichenfolgen wird immer übereinstimmen, sodass sich der 3. Eintrag in Spalte 1 immer auf den 3. Eintrag in Spalte 2 bezieht.
Aber wenn ich den String-Split durchführe, werden die Befehle durcheinander gebracht
Ich habe Self Joins, Sub Selects und Herumspielen mit Order By ausprobiert, aber ich kann es einfach nicht in Ordnung bringen.
Ich habe eine Weile online gesucht, also komme ich nicht einfach in die Community, ohne es vorher zu versuchen, und ich freue mich über jede Hilfe oder Anleitung, und ich habe natürlich hier nach der Antwort gesucht, aber ich hatte kein Glück.
Update: Bitte beachten Sie Folgendes:
-
Das wurde nicht von mir gebaut, ich tauche ein, ohne dass eine technische Spezifikation durch die DB gehen muss, ich bin sicher, einige von Ihnen werden meinen Schmerz kennen. Wenn ich die Genehmigung bekomme, werde ich das neu gestalten, aber ich kann es vorerst nicht (ich könnte aber eine andere Tabelle machen). Die Daten kommen automatisch von einer Maschine wie dieser als Liste von Zeichenketten herein
-
Es gibt etwa 50 Werte in jeder Spalte
Gewünschte Ausgabe ist:
Der springende Punkt dabei ist, dass ich Analysen in einer anderen Software durchführen kann (wiederum eine Anfrage), aber das Array kann in der Software nicht aussortiert werden.
Danke Leute,
Sehr geschätzt
Lösung
Die wahrscheinlich beste Lösung besteht darin, das Design zu ändern, aber wenn Sie die Eingabedaten parsen müssen, können Sie einen JSON-basierten Ansatz ausprobieren. Die Idee besteht darin, die Werte von column1
und column2
Spalten in gültige JSON-Arrays ( my_fav_drink, my_fav_colour, my_fav_avenger
into ["my_fav_drink", "my_fav_colour", "my_fav_avenger"]
) umzuwandeln und die Arrays mithilfe eines OPENJSON()
Standardschemas zu analysieren. Das Ergebnis der OPENJSON()
Ausführung ist eine Tabelle mit den Spalten key
und value
und type
die Werte in der key
Spalte sind die Indizes der Elemente im Eingabearray.
Tisch:
CREATE TABLE Data (
column1 varchar(100),
column2 varchar(100)
)
INSERT INTO Data (column1, column2)
VALUES ('my_fav_drink,my_fav_colour,my_fav_avenger', 'coffee,blue,dr_strange')
Aussage:
SELECT CONVERT(int, j1.[key]) + 1 AS [Number], j1.[value] AS [Label], j2.[value] AS [Value]
FROM Data d
CROSS APPLY OPENJSON(CONCAT('["', REPLACE(STRING_ESCAPE(d.column1, 'json'), ',', '","'), '"]')) j1
CROSS APPLY OPENJSON(CONCAT('["', REPLACE(STRING_ESCAPE(d.column2, 'json'), ',', '","'), '"]')) j2
WHERE j1.[key] = j2.[key]
Ergebnis:
Number Label Value
1 my_fav_drink coffee
2 my_fav_colour blue
3 my_fav_avenger dr_strange
Beantwortet von – Zhorov
Antwort geprüft von – Clifford M. (FixError Volunteer)