icet83
Goto Top

SQL Abfrage: Textfeld aufsplitten nach Trennzeichen

Hallo zusammen,

ich habe eine Db2 Datenbank, dort gibt es eine Tabelle mit einer Spalte in die Maße als Text eingetragen werden Höhe*Breite*Länge und hin und wieder als vierter Wert die Anzahl,
das Ganze sieht dann in etwa so aus 100x120x80 oder 120X180X60X2 (weil es zwei Stücke sind).

Ich möchte nun per SQL-Abfrage das Textfeld in 3 bzw. 4 Spalten trennen, immer nachdem x wobei das x auch X (groß geschrieben sein kann), um danach die einzelnen Werten weiter zu verarbeiten.
Hat jemand eine Idee wie ich dass realisieren kann?

Content-Key: 382738

Url: https://administrator.de/contentid/382738

Printed on: April 25, 2024 at 13:04 o'clock

Member: sabines
sabines Aug 09, 2018 at 04:39:24 (UTC)
Goto Top
Moin,

du untersuchst den String mit charindex, damit findest Du die Position des Zeichen X, danach kannst Du den String weiteruntersuchen und ggfs. aufteilen.

Oder du exportierst den Schmotter in Excel machst dort die Aufteilung mit und reimportierst es.
Immer schön ans Backup denken.

Gruss
Member: em-pie
em-pie Aug 09, 2018 updated at 04:53:02 (UTC)
Goto Top
Moin,

Die DB2 sollte ein Locate kenne/ können

https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/sqlref/src/ ...

In Kombination mit SubStr solltest du dann zum Ergebnis kommen:

https://stackoverflow.com/questions/18961996/how-to-split-a-string-value ...

Habe es aber nicht getestet, da ich noch nicht @work bin und an unsere Power8 dran komme...

Gruß
em-pie
Member: icet83
icet83 Aug 09, 2018 at 08:22:08 (UTC)
Goto Top
Vielen Dank, für eure Rückmledungen.
Der Vorschlag mit Excel wird zur Zeit so gemacht, wollte es vereinfachen.

Bin nun einen Schritt weiter gekommen und folgende SQL Abfrage gebaut:
        ,rhw329
	, SUBSTR(rhw329, 1, LOCATE_IN_STRING(rhw329,'x',1,1)-1) AS Erster  
	, SUBSTR(rhw329, LOCATE_IN_STRING(rhw329,'x',1,1)+1, LOCATE_IN_STRING(rhw329,'x',1,2)-LOCATE_IN_STRING(rhw329,'x',1,1)-1) AS Zweiter  
	, SUBSTR(rhw329, LOCATE_IN_STRING(rhw329,'x',1,2)+1, LOCATE_IN_STRING(rhw329,'x',1,3)-LOCATE_IN_STRING(rhw329,'x',1,2)-1) AS Dritter  
	, SUBSTR(rhw329, LOCATE_IN_STRING(rhw329,'x',1,3)+1, LENGTH(rhw329)-LOCATE_IN_STRING(rhw329,'x',1,3)) AS Vierter  

Allerdings sieht das Ergebnis noch nicht wie gewünscht aus, zum einen funktioniert das Ganze bisher nur wenn es 4 Werte sind, wenn es nur 3 sind gibt er mir folgendes aus (siehe Screenshot).
Zusätzlich bräuchte ich noch eine Möglichkeit die Groß- und Kleinschreibung des Trennzeichen "x" bzw. "X" zu berücksichtigen,
gibt es da was?
substring
Member: sabines
sabines Aug 09, 2018 at 08:58:40 (UTC)
Goto Top
Moin,

willst Du die Tabelle dauerhaft umbauen, oder nur eine Abfrage bauen?

Gruss
Member: icet83
icet83 Aug 09, 2018 updated at 13:43:11 (UTC)
Goto Top
Eine Abfrage, die Tabelle ansich kann ich nicht umbauen, zu tief verschachtelt ;)

Ziel ist es, die Werte/Zahlen in die 3 bzw. 4 Spalten zu trennen und dann mit diesen Spalten weiter zu arbeiten.
Member: icet83
icet83 Aug 13, 2018 at 11:17:59 (UTC)
Goto Top
Hat niemand mehr eine Idee?
Member: sabines
sabines Aug 13, 2018 at 12:04:32 (UTC)
Goto Top
Zitat von @icet83:

Eine Abfrage, die Tabelle ansich kann ich nicht umbauen, zu tief verschachtelt ;)


Verschachtelte Tabellen kenne ich so nicht, nur Abfragen.
Wenn Du das öfters brauchst, würde ich die Tabelle mit einem aufteilenden Select into temptabelle kopieren.
Dann hast Du das was Du willst und die Abfragen werden leichter und übersichtlicher, vermutlich auch schneller.
Member: icet83
icet83 Aug 14, 2018 at 15:51:30 (UTC)
Goto Top

Eine Abfrage, die Tabelle ansich kann ich nicht umbauen, zu tief verschachtelt ;)

Wollte damit nur ausdrücken dass ich an der Tabelle an sich nichts ändern kann/darf, daher ja die Abfrage.

Meine Ideal Vorstellung dieser Abfrage wäre das die Werte auf dem Textfeld z.B. 120x100x120 in die 3 bzw. 4 Spalten (wie Screenshot oben) aufgetrennt werden und das irgendwie zuverlässig egal ob x oder X. Dann möchte ich mit den einzel Werten rechnen, das Volumen bestimmen, aber das geht bisher mit den oben aufgetrennten Spalten nicht.
Hab hier auch schon rum probiert die Werte mit CAST in Integer oder in Decimal zu convertieren, klappt aber nicht...
Member: buka2000
buka2000 Sep 17, 2021 at 19:33:55 (UTC)
Goto Top
... ist zwar schon ein bisschen älter, war aber genau das, was ich eben brauchte. Danke icet83

Das Feld muss ausreichend Trennzeichen enthalten, also noch ein paar x hinten dran.
Groß- durch Kleinbuchstaben ersetzen mit Replace(rhw329, 'X', 'x')

Select rhw329_original, rhw329
     , SUBSTR(rhw329,                                      1, LOCATE_IN_STRING(rhw329, 'x', 1, 1)                                       -1) AS Erster  
     , SUBSTR(rhw329, LOCATE_IN_STRING(rhw329, 'x', 1, 1) +1, LOCATE_IN_STRING(rhw329, 'x', 1, 2) - LOCATE_IN_STRING(rhw329, 'x', 1, 1) -1) AS Zweiter  
     , SUBSTR(rhw329, LOCATE_IN_STRING(rhw329, 'x', 1, 2) +1, LOCATE_IN_STRING(rhw329, 'x', 1, 3) - LOCATE_IN_STRING(rhw329, 'x', 1, 2) -1) AS Dritter  
     , SUBSTR(rhw329, LOCATE_IN_STRING(rhw329, 'x', 1, 3) +1, LOCATE_IN_STRING(rhw329, 'x', 1, 4) - LOCATE_IN_STRING(rhw329, 'x', 1, 3) -1) AS Vierter  
     , SUBSTR(rhw329, LOCATE_IN_STRING(rhw329, 'x', 1, 4) +1, LENGTH(rhw329)                      - LOCATE_IN_STRING(rhw329, 'x', 1, 4)   ) AS Rest  
From
( Select rhw329 as rhw329_original
       , Replace(rhw329, 'X', 'x') || 'xxxx' as rhw329  
  From  
  ( Select '100x120x80' as  rhw329 from sysibm.sysdummy1    union  
    Select '120X180X60X2' as  rhw329 from sysibm.sysdummy1  
  ) 
)

screenshot 2021-09-17 213015

VG buka2000