String ausschneiden...

blaster31

Neuer Benutzer
Beiträge
3
hallo

ich arbeite neu mit dem "SQL Server Management Studio Express".
dabei habe ich folgedes sql-problem:

ich habe eine tabelle 'artikel' worin das feld 'name' enthalten ist.
in diesem feld 'name' hat es jeweils 2 worte die durch ' - ' getrennt sind
--> bsp: Hans - Muster (Privat)

mit welcher sql-abfrage, kann ich aus diesem string 'Hans - Muster (Privat)' nur den Namen 'Muster' ausgeben?
für mich ist 'Hans - ' und '( Privat)' nicht wichtig und wird somit nicht benötigt...

da ich von sql keine ahnung habe, wäre ich um hilfe sehr dankbar.

ich hoffe das mir jemand weiterhelfen kann.

danke schon im voraus für die hilfe.

gruss
 
Werbung:
Wenn du immer das Format "xxx - xxx (xxx)" im String hast:
Code:
SELECT    left(right(name,len(name)-charindex('-',name)-1),charindex('(',right(name,len(name)-charindex('-',name)-1))-2)
FROM    artikel

Im Prinzip brauchst du nur mehrere Funktionen kombinieren:
charindex() - sucht ein Zeichen in einer Zeichenfolge und gibt den ersten Treffer zurück
patindex() - sucht eine Zeichenfolge
len() - Länge
left() - x Zeichen von Links
right() - x Zeichen von Rechts

Wenn das Format Fehler aufweisen kann, z.B. weil ein Leerzeichen fehlt, musst du natürlich etwas mehr Aufwand betreiben. Bei Bindestrich im Vornamen hast du hier eventuell schon dein erstes Problem mit charindex(), es ginge aber auch patindex().
 
hallo ukulele

danke nochmals für deine hilfe mit dem sql.
left(right(name,len(name)-charindex('-',name)-1),charindex('(',right(name,len(name)-charindex('-',name)-1))-2)

momentan ist mir nur noch etwas unklar.
wenn ich das untenstehende sql anstosse, bekomme ich folgendes resultat:

****************
SELECT

case when a.cname like '%-%' then left(right(a.cname,len(a.cname)-charindex('-',a.cname)-1),charindex('(',right(a.cname,len(a.cname)-charindex('-',a.cname)-1))-2)
else a.cname
end as produkt_name

--left(right(a.cname,len(a.cname)-charindex('-',a.cname)-1),charindex('(',right(a.cname,len(a.cname)-charindex('-',a.cname)-1))-2),
a.cname
from [eazybusiness].[dbo].[tartikel] A

where A.fGewicht between 0.00 and 0.02 and
a.cAktiv = 'y'
and
cArtNr = '130649'
****************


resultat:
produkt_name cname
abcdefghij 123456 - abcdefghij (XYZ)

****************


das resultat des einen artikels sieht echt super aus, aber sobald ich über sämtliche 30'000 artikel gehe bekomme ich folgende fehlermeldung:

****************
Meldung 536, Ebene 16, Status 5, Zeile 1

Es wurde ein ungültiger Längenparameter an die SUBSTRING-Funktion übergeben.
****************

weisst du an was das liegt?

danke schon im voraus für deine unterstützung.

gruss blaster31
 
Das kann alles mögliche sein, z.B. NULL Werte in der Spalte Name. Auch wird dir die Abfrage auf LIKE '%-%' nichts bringen, wenn du einen Vornamen mit Bindestrich hast wie Anton-Richard Meyer. Ich würde empfehlen, eine Zusätzliche Spalte für Vorname / Nachname anzulegen und dann per Schleife alle Namen setzen lassen. Dort wo die Schleife scheitert, kann man dann nachträglich schauen, an was es liegt.

Kannst du Spalten anlegen in der Tabelle und hat die Tabelle einen Primär Key? Wenn ja was für einen? (UNIQUEIDENTIFIER oder fortlaufender INT)
 
PS: Wenn charindex() das zeichen nicht im String findet, und dieser Wert dann für len() verwendet wird, gibt es natürlich die von dir genannte Fehlermeldung. In sofern ist es wichtig, sich Gedanken zu machen wie das "Format" zustande kommt, welche Fehler es haben kann. Da es offensichtlich Problemfälle gibt, wird ein Automatismus sehr schwer zu schreiben sein. Wenn es aber eine einmalige Umstellung ist, wirst du 95% recht schnell konvertiert kriegen mit einer Schleife (kann ich dir grade schreiben) und dann siehst du, wo es hakt.
 
habe das problem jetzt mit einem case gelöst. funktioniert jetzt einwandfrei. danke für den tollen support. ich kann dich von herzen weiterempfehlen :)
 
Hallo,

ich habe folgenden String:
"XXXXX" BIC:BAWAATXX IBAN:DE123456789012345678 Name:Die Firma Reference: FACT

Ich möchte nun in 3 Spalten die Werte "BIC:BAWAATXX", "IBAN:DE123456789012345678" und "Name:Die Firma" getrennt anzeigen.
Dabei kann es sein, dass die Länge dieser Werte variieren können, sprich ein BIC hat 10 Zeichen, ein anderer aber nur 8. Genauso gilt es auch für IBAN und den Namen. Der Name endet vor "Reference".

Der Eintrag von blaster31 zeigt mir den BIC richtig an, aber bei IBAN funktioniert das leider nicht.
SELECT
case when a.cname like '%BIC%' then left(right(a.cname,len(a.cname)-charindex('-',a.cname)-1),charindex('(',right(a.cname,len(a.cname)-charindex('-',a.cname)-1))-1)

else a.cname
end as BIC
Bitte um eure Unterstützung!

Danke und lG,
Ram
 
Bin jetzt kein MS SQL Experte... Aber das sollte es wohl tun?
Code:
Select substring(dein_string, charindex('BIC:', dein_string, 1), charindex(' ', dein_string, charindex('BIC:', dein_string, 1) +1) - charindex('BIC:', dein_string, 1) -1)
      ,substring(dein_string, charindex('IBAN:', dein_string, 1), charindex(' ', dein_string, charindex('IBAN:', dein_string, 1) +1) - charindex('IBAN:', dein_string, 1) -1)
      ,substring(dein_string, charindex('NAME:', dein_string, 1), charindex(' ', dein_string, charindex('NAME:', dein_string, 1) +1) - charindex('NAME:', dein_string, 1) -1)
From tabelle
Edit: Ich seh grade... Charindex gibts wohl erst aber MS SQL Server 2014...
 
Hallo Distrilec,

Danke für deine Unterstützung. BIC und IBAN sehen jetzt super aus.
Der Name ist aber abgeschnitten. Sprich der String "Name: Die Firma" wird mir "Name: Die" angezeigt. Ein Name kann aber ewig lang sein, mit mehreren Leerzeichen. Endet aber öfters bei "Ref:" oder geht bis zum Schluss:
1- BIC:ABCDEFGH IBAN:DE4000000015455877 Name:Die Gute Firma, LDA.
2- BIC:APLKHMBDFG IBAN:AT5026900015915964 Name:Tolle Firma tolle Produkte, AG Referen

Bei 1- endet der Name am Ende
Bei 2- endet der Name vor Referen

Hier nochmal der Code von Distrilec.
Code:
Select substring(dein_string, charindex('BIC:', dein_string, 1), charindex(' ', dein_string, charindex('BIC:', dein_string, 1) +1) - charindex('BIC:', dein_string, 1) -1)
      ,substring(dein_string, charindex('IBAN:', dein_string, 1), charindex(' ', dein_string, charindex('IBAN:', dein_string, 1) +1) - charindex('IBAN:', dein_string, 1) -1)
      ,substring(dein_string, charindex('NAME:', dein_string, 1), charindex(' ', dein_string, charindex('NAME:', dein_string, 1) +1) - charindex('NAME:', dein_string, 1) -1)
From tabelle

Btw: Wenn ich BIC: und IBAN: nicht im Ergebnis sehen möchte, wie mache ich das? Sprich jetzt bekomme ich als Ergebnis: "BIC:ABCDEFGH". Wie bekomme ich es so: "ABCDEFGH"?

Danke und lG,
Ram
 
Ich denke das sollte funktionieren...
Code:
Select substring(dein_string, charindex('BIC:', dein_string, 1) + 4, charindex(' ', dein_string, charindex('BIC:', dein_string, 1) +1) - charindex('BIC:', dein_string, 1) -5)
      ,substring(dein_string, charindex('IBAN:', dein_string, 1) + 5, charindex(' ', dein_string, charindex('IBAN:', dein_string, 1) +1) - charindex('IBAN:', dein_string, 1) -6)
      ,substring(dein_string, charindex('NAME:', dein_string, 1) + 5, case when charindex('REF:', dein_string, charindex('NAME:', dein_string, 1) +1) = 0 then len(dein_string) else charindex('REF:', dein_string, charindex('NAME:', dein_string, 1) +1) end - charindex('NAME:', dein_string, 1) -6)
From tabelle
 
Perfekt, danke dir!
Wichtig wäre für mich, dass ich das Ganze auch verstehe, damit ich solche komplizierte Sachen auch selber machen kann.
Ich kenne die Syntax für Substring
( expression ,
start ,
length )

(dein_string, -> das ist klar :)
charindex('BIC:', dein_string, 1) + 4, -> Ich suche die expression 'BIC:' im String "dein_string". Soweit klar. Was bedeuten "...1 ) + 4"
charindex(' ', dein_string, charindex('BIC:', dein_string, 1) +1) - charindex('BIC:', dein_string, 1) -5) -> Was heißt hier " ... +1)- char..." ? Was tu ich hier?

Danke für die Erklärung!

LG,
Ram
 
charindex('BIC:', dein_string, 1) + 4, -> Ich suche die expression 'BIC:' im String "dein_string". Soweit klar. Was bedeuten "...1 ) + 4"
Ich suche die erste Stelle im String in der er die Zeichenfolge findet (Ich beginne beim ersten Zeichens des Strings (also am Anfang) -> dafür steht die 1)
Ich addiere 4 Zeichen zu meinem Ergebnis (also Zeichenzahl wo er die Zeichenfolge gefunden hat + 4 Zeichen um dein "BIC:" zu "überspringen")
charindex(' ', dein_string, charindex('BIC:', dein_string, 1) +1) - charindex('BIC:', dein_string, 1) -5) -> Was heißt hier " ... +1)- char..." ? Was tu ich hier?
Du kopierst dir hier irgendwie nur Teilestücke zusammen... Aber egal...
Ich suche das Zeichen ' ' (Ein Leerzeichen) im String, beginnend ab der Position des "BIC:" +1 (Ich möchte ja das er mir die Position des ersten Leerzeichens nach dem "BIC:" ausgibt, deswegen fange ich an hier zu suchen)
-- Hier fehlt jetzt ein Teil des "kompletten Codes" den ich jetzt einfach mal einfüge:

charindex(' ', dein_string, charindex('BIC:', dein_string, 1) +1) - charindex('BIC:', dein_string, 1) -5
Das wird quasi nichts weiter als die Länge des Substrings das ich haben will...
Also die Zeichenzahl des ersten Leerzeichens das er nach "BIC:" findet MINUS die Position wo er "BIC:" gefunden hat MINUS 5 (Die Minus 5 sind wieder nur um das "BIC:" rauszubekommen und das Leerzeichen zu entfernen, da wir ansonsten einen Substring inklusive Leerzeichen am Ende hätten... Nicht dragisch, stört aber sobald mein weiß dass es da ist :) )

Ich hoffe das war verständlich?...
 
Werbung:
Zurück
Oben