Heim >Datenbank >MySQL-Tutorial >Wie kann ich einen einzelnen Spaltenwert, der mehrere Datensegmente enthält, effizient in separate Spalten in einer Datenbank aufteilen?

Wie kann ich einen einzelnen Spaltenwert, der mehrere Datensegmente enthält, effizient in separate Spalten in einer Datenbank aufteilen?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-17 10:41:24504Durchsuche

How can I efficiently split a single column value containing multiple data segments into separate columns in a database?

Einen einzelnen Spaltenwert in mehrere Spalten aufteilen

In Datenbanken besteht eine häufige Aufgabe darin, einen einzelnen Spaltenwert aufzuteilen, der mehrere Teile enthält Informationen in separate Spalten. In diesem Artikel wird ein Inline-Ansatz zum Erreichen dieser Datentransformation vorgestellt.

Problemstellung

Wir haben eine Tabelle mit Abonnements, in der die Abonnementnummer als einzelner Wert gespeichert ist in einer Spalte. Die Abonnementnummer besteht aus mehreren Segmenten, die durch Bindestriche und Leerzeichen getrennt sind. Das Ziel besteht darin, diesen Wert in einzelne Spalten aufzuteilen, beispielsweise das Präfix, Segment 1, Segment 2 usw.

Beispiel

Betrachten Sie das folgende Beispielabonnement Zahlen:

SC 5-1395-174-25P
SC 1-2134-123-ABC C1-2
SC 12-5245-1247-14&P
SC ABCD-2525-120

Lösung

Hier ist eine Inline-Abfrage, die die Aufteilung durchführt:

Declare @YourTable table (SomeCol varchar(max))
Insert Into @YourTable values
('SC 5-1395-174-25P'),
('SC 1-2134-123-ABC C1-2'),
('SC 12-5245-1247-14&P'),
('SC ABCD-2525-120')


Select B.*
 From  @YourTable A
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                      ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                      ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
                      ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
                      ,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
                From  (Select Cast('<x>' + replace((Select replace(replace(A.SomeCol,' ','-'),'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

Ergebnis

Die Ausgabe der Abfrage lautet wie folgt:

+---------+---------+---------+---------+---------+---------+---------+
| COL1    | COL2    | COL3    | COL4    | COL5    | COL6    | COL7    |
+---------+---------+---------+---------+---------+---------+---------+
| SC      | 5       | 1395    | 174     | 25P     | NULL    | NULL    |
| SC      | 1       | 2134    | 123     | ABC     | C1      | 2       |
| SC      | 12      | 5245    | 1247    | 14&P    | NULL    | NULL    |
| SC      | ABCD    | 2525    | 120     | NULL    | NULL    | NULL    |
+---------+---------+---------+---------+---------+---------+---------+

Erklärung

Die Abfrage verwendet eine Kreuzanwendung, um eine Reihe von Zeilen für jedes Segment im zu erstellen Abonnementnummer. Der XML-Pfadausdruck „/x[1]“ extrahiert das erste Segment, „/x[2]“ extrahiert das zweite Segment und so weiter. Die ltrim- und rtrim-Funktionen werden verwendet, um alle führenden oder nachfolgenden Leerzeichen zu bereinigen.

Alternativer Ansatz

Sie können auch spontan eine neue Tabelle erstellen, um die Aufteilung zu speichern Werte:

Declare @YourTable table (PUB_FORM_NUM varchar(max))
Insert Into @YourTable values
('SC 5-1395-174-25P'),
('SC 1-2134-123-ABC C1-2'),
('SC 12-5245-1247-14&P'),
('SC ABCD-2525-120')

Select A.PUB_FORM_NUM
      ,B.*
 Into  MyNewPubTable
 From  @YourTable A
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                      ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                      ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
                      ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
                      ,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
                From  (Select Cast('<x>' + replace((Select replace(replace(A.PUB_FORM_NUM,' ','-'),'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

Select * From MyNewPubTable

Fazit

Die bereitgestellten Der Inline-Ansatz ist eine vielseitige Lösung zum Extrahieren mehrerer Segmente aus einem einzelnen Spaltenwert. Es kann leicht an Ihre spezifischen Datenanforderungen angepasst werden.

Das obige ist der detaillierte Inhalt vonWie kann ich einen einzelnen Spaltenwert, der mehrere Datensegmente enthält, effizient in separate Spalten in einer Datenbank aufteilen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn