1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

String ausschneiden...

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von blaster31, 26 August 2011.

  1. blaster31

    blaster31 Neuer Benutzer

    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
     
  2. ukulele

    ukulele Datenbank-Guru

    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().
     
  3. blaster31

    blaster31 Neuer Benutzer

    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
     
  4. ukulele

    ukulele Datenbank-Guru

    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)
     
  5. ukulele

    ukulele Datenbank-Guru

    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.
     
  6. blaster31

    blaster31 Neuer Benutzer

    habe das problem jetzt mit einem case gelöst. funktioniert jetzt einwandfrei. danke für den tollen support. ich kann dich von herzen weiterempfehlen :)
     
  7. Rambo21

    Rambo21 Aktiver Benutzer

    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
     
  8. Distrilec

    Distrilec Datenbank-Guru

    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...
     
    Rambo21 und ukulele gefällt das.
  9. ukulele

    ukulele Datenbank-Guru

  10. Distrilec

    Distrilec Datenbank-Guru

    Das hat mir die msdn so gesagt :( Ich hab doch keine Ahnung von T-SQL ...
     
  11. Rambo21

    Rambo21 Aktiver Benutzer

    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
     
  12. Distrilec

    Distrilec Datenbank-Guru

    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
     
  13. Rambo21

    Rambo21 Aktiver Benutzer

    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
     
  14. Distrilec

    Distrilec Datenbank-Guru

    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")
    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:

    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?...
     
    Walter gefällt das.
  15. Rambo21

    Rambo21 Aktiver Benutzer

    Danke für das Tutorial. Mehr als verständlich. Werde es auch gleich paar mal anders ausprobieren.
     

Diese Seite empfehlen