none
Wie kann man mit T-SQL alle Werte in einer Spalte finden, die bis auf die letzten n Zeichen übereinstimmen? RRS feed

  • Frage

  • Hallo zusammen,

    ich möchte mit Hilfe einer SQL-Abfrage in einer Tabelle alle Werte aus einer Spalte 'Produkt' finden, die bis auf die letzten n Zeichen übereinstimmen.

    Beispiel:
    Produkt
    100020011
    100030011
    100020012

    wird für das Beispiel n = 2 gesetzt, so sollte das Ergebnis wie folgt aussehen:
    Produkt
    100020011
    100020012

    Kann mir hier jemand auf die Sprünge helfen?

    Gruß

    Jürgen

    Dienstag, 9. Oktober 2018 09:14

Antworten

  • Hi Jürgen,
    wie wäre es damit?

    WITH temptab as (Select Left(Spalte1,len(Spalte1)-2) AS S1
    FROM DemoTab)
    SELECT * FROM DemoTab 
    WHERE Left(Spalte1,len(Spalte1)-2) 
    IN (SELECT S1 FROM temptab GROUP BY S1 HAVING Count (1) > 1)

    Das bringt für Deine Demodaten genau das genannte Ergebnis.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert Jürgen Sch Dienstag, 9. Oktober 2018 10:50
    Dienstag, 9. Oktober 2018 10:42

Alle Antworten

  • Am einfachsten und für SQL auch optimierbar machst du das mit Like:

    where Produkt like '10002001%'

    Die Anzahl der Stellen am Ende ist da dann egal.
    Ansonsten müsstest du mit Substring arbeiten, was aber u.U. einen Tablescan verursacht.

    Dienstag, 9. Oktober 2018 09:18
  • Hallo bfuerchau,

    danke für die Antwort. Nur ganz so einfach ist nun mal nicht. Das mit dem Like ist mir schon klar, nur muss dafür die Länge der Nummer bekannt sein.

    Ich dachte an folgendes:
    WHERE [Produkt] LIKE (LEFT([Produkt], LEN([Produkt]) - n) + '%')

    sowas in der Form???

    Dienstag, 9. Oktober 2018 09:36
  • Hi,

    wie soll das gehen? Letztendlich würde dann 1000300 auch kommen, da 100030011 der Abfrage auch entsprechen würde.

    Wenn man das so eingrenzen kann, dass mind. zwei Entsprechungen existieren müssen oder der Anfang der Nummer auch bekannt ist, wäre das machbar aber ohne weitere Kriterien eher nicht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Dienstag, 9. Oktober 2018 09:57
    Moderator
  • Nochmal zur Ergänzung:

    Finde alle Werte, die in den ersten m - n Zeichen übereinstimmen, mit m = LEN(Produkt)

    (siehe obiges Ergebnis: Übereinstimmung in der ersten 7 Zeichen)

    Gruß Jürgen

    Dienstag, 9. Oktober 2018 10:18
  • Hallo Jürgen,

    das hilft auch nicht, da die Definition auch alle Werte bringt, bei denen es nur einen Datensatz gibt. Der Wert stimmt immer mit den ersten 7 (x) Stellen überein!

    Also nochmal die Frage: Kann man das noch weiter eingrenzen? Oder müssen mind. zwei Datensätze vorhanden sein, die das Kriterium erfüllen?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Dienstag, 9. Oktober 2018 10:38
    Moderator
  • Hi Jürgen,
    wie wäre es damit?

    WITH temptab as (Select Left(Spalte1,len(Spalte1)-2) AS S1
    FROM DemoTab)
    SELECT * FROM DemoTab 
    WHERE Left(Spalte1,len(Spalte1)-2) 
    IN (SELECT S1 FROM temptab GROUP BY S1 HAVING Count (1) > 1)

    Das bringt für Deine Demodaten genau das genannte Ergebnis.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert Jürgen Sch Dienstag, 9. Oktober 2018 10:50
    Dienstag, 9. Oktober 2018 10:42
  • Hallo Peter,

    ich grüße dich. Lange nichts voneinander gehört/gelesen :-)

    Donnerlüttchen, deine Abfrage passt wie die Faust aufs Auge. Danke!

    Danke auch an alle anderen.

    Gruß

    Jürgen

    @Peter: schau doch bitte mal in meinen Post mit der komplexen Abfrage hinsichtl. der Kommunikationskreise

    Dienstag, 9. Oktober 2018 10:53
  • Hallo Jürgen,

    freut mich, dass es mit Peters Antwort klappt.

    Dennoch wäre es hilfreich gewesen, mal Antworten auf gestellte Rückfragen zu geben. Letztendlich ist es genau das, was ich gefragt hatte: Es muss mehr als ein Datensatz existieren.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Dienstag, 9. Oktober 2018 11:08
    Moderator
  • Hallo Stefan,

    sorry, aber das hat sich alles überschnitten, da parallel das Ganze noch an meinem richtigen Projekt (Datenbank) versuche umzusetzen.

    Aber vielleicht kannst du mir dabei helfen, basierend auf der Ausgabe des Ergebnisses von Peter, die Ausgabe so zu verändern, dass die zueinander gefundenen "Blöcke" separat in einer Spalte stehen, wie folgende Abb. zeigt:

    Dafür hatte ist die Grundtabelle um die weiteren Werte erweitert.

    Es wäre schön, wenn du mir dafür einen Ansatz geben könntest.

    Gruß

    Jürgen

    Dienstag, 9. Oktober 2018 11:38