Nik: SQL: Kann ich mit Substring abfragen?

Hallo,

ist es in SQL möglich (und wie?), eine Spalte, die nach dem Muster

"Gattung-Jahr-unwichtig-fortlaufende Nr.", also zb. "XYZ-2010-abcd-0001"

aufgebaut ist so abzufragen?

<prosa>
SELECT MAX(fortlaufende Nummer) FROM table WHERE Gattung = 'XYZ' and Jahr = 2010
</prosa>

Gruß, Nik

  1. Hallo,

    <prosa>
    SELECT MAX(fortlaufende Nummer) FROM table WHERE Gattung = 'XYZ' and Jahr = 2010
    </prosa>

    Nein, MAX und MIN sind Werte, die sich aus der Gruppierung (GROUP BY) von DB-Zeilen ergibt. Also eine einzige Zeile kann keinen MAX-Wert haben. Es sei denn, eine Gruppe besteht nur aus dieser einen Zeile.

    Die höchste Nummer für Gattung = 'XYZ' and Jahr = 2010 erhälst du mit
    SELECT MAX(fortlaufende Nummer) FROM table WHERE Gattung = 'XYZ' and Jahr = 2010 GROUP BY Gattung, Jahr

    Linuchs

  2. Hi!

    ist es in SQL möglich (und wie?), eine Spalte, die nach dem Muster

    "Gattung-Jahr-unwichtig-fortlaufende Nr.", also zb. "XYZ-2010-abcd-0001"

    aufgebaut ist so abzufragen?

    <prosa>
    SELECT MAX(fortlaufende Nummer) FROM table WHERE Gattung = 'XYZ' and Jahr = 2010
    </prosa>

    Ja. Du hast nicht erwaehnt, welches SQL. Ich verlinke deshalb hier einfach mal ein paar Dokumentationen. Es laeuft aber alles recht aehnlich.

    mySQL http://dev.mysql.com/doc/refman/5.1/de/string-functions.html
    Transact-SQL (Access) http://technet.microsoft.com/de-de/library/ms187748.aspx

    Die Stringfunktionen fuegst du dort ein wo du Teile des Strings verarbeiten willst.

    Select Left("SelfHTML", 4) as Motto ergibt z.b. Motto = "Self"

    Die Frage, die sich mir stellt, ist allerdings, ob da nicht das Datenmodell ueberdacht werden sollte. Mehr als eine Information sollte eigentlich nicht pro Feld vorhanden sein...

    --
    Signaturen sind bloed.
    1. Hallo,

      Ja. Du hast nicht erwaehnt, welches SQL.

      Im Moment mysql. Aber wer weiß das schon, ob ich nicht irgendwann mal umsteige?

      Die Frage, die sich mir stellt, ist allerdings, ob da nicht das Datenmodell ueberdacht werden sollte. Mehr als eine Information sollte eigentlich nicht pro Feld vorhanden sein...

      Ich frage mich auch gerade, ob es nicht Sinn macht, einfach die fortlaufende Nummer redundant in einer weiteren Spalte mitzuführen.

      Nik

      1. Ja. Du hast nicht erwaehnt, welches SQL.

        Im Moment mysql. Aber wer weiß das schon, ob ich nicht irgendwann mal umsteige?

        Das macht kaum was. Man muesste in den meisten Faellen nur die Funktionsnamen aendern. Aber zusaetzliche Stingoperationen bei jedem Datensatz gehen natuerlich zu lasten der Performance.

        Die Frage, die sich mir stellt, ist allerdings, ob da nicht das Datenmodell ueberdacht werden sollte. Mehr als eine Information sollte eigentlich nicht pro Feld vorhanden sein...

        Ich frage mich auch gerade, ob es nicht Sinn macht, einfach die fortlaufende Nummer redundant in einer weiteren Spalte mitzuführen.

        Das waere in der Tat wohl die performanteste Loesung. Die anderen Daten hast Du ja schon in anderen Feldern, wies klingt. Im Normalfall (Wortspiel) haette man alle Daten einzeln und wuerde deinen String erstellen.

        --
        Signaturen sind bloed.
  3. Hi,

    ist es in SQL möglich (und wie?), eine Spalte, die nach dem Muster

    "Gattung-Jahr-unwichtig-fortlaufende Nr.", also zb. "XYZ-2010-abcd-0001"
    aufgebaut ist so abzufragen?

    <prosa>
    SELECT MAX(fortlaufende Nummer) FROM table WHERE Gattung = 'XYZ' and Jahr = 2010
    </prosa>

    Wenn die Teile des Strings einzeln eine Bedeutung haben, und die Teile auch immer wieder einzeln benötigt werden, wäre es vermutlich sinnvoller, die nicht in eine einzige Spalte zu quetschen, sondern jedem Teil seine eigene Spalte zu gönnen.

    Wenn das nicht geht, sowas in der Art sollte funktionieren:

    SELECT MAX(substring(SpalteMitMuster, ...)) FROM table where SpalteMitMuster like 'XYZ-2010-%'

    ggf. um den Substring noch einen Cast nach Integer ...

    Die genaue MySQL-Syntax für Substring verrät Dir das mysql-Handbuch.
    Ist die Länge des letzten Teils immer gleich? Oder ist das entscheidende Kriterium der letzte '-'?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. Hi,

      Ist die Länge des letzten Teils immer gleich? Oder ist das entscheidende Kriterium der letzte '-'?

      Der letzte Teil ist immer genau 4 Zeichen lang.
      Letztlich könnte ich mir sogar die anderen beiden relevanten Werte, also das "XYZ" und die "2010" aus anderen Spalten der Tabelle herleiten.

      Es geht also tatsächlich nur um die fortlaufende Nummer.

      cu, Nik

      1. Moin!

        Der letzte Teil ist immer genau 4 Zeichen lang.
        Letztlich könnte ich mir sogar die anderen beiden relevanten Werte, also das "XYZ" und die "2010" aus anderen Spalten der Tabelle herleiten.

        Es geht also tatsächlich nur um die fortlaufende Nummer.

        Dann nimm die 4 Zeichen von rechts. Die bekommst Du mit der entsprechenden Funktion deines SQL Dialekts. - meist RIGHT()

        --
        Signaturen sind bloed.
  4. Tach!

    ist es in SQL möglich (und wie?), eine Spalte, die nach dem Muster
    "Gattung-Jahr-unwichtig-fortlaufende Nr.", also zb. "XYZ-2010-abcd-0001"
    aufgebaut ist so abzufragen?
    SELECT MAX(fortlaufende Nummer) FROM table WHERE Gattung = 'XYZ' and Jahr = 2010

    Schwer. Es gibt kein explode() oder ähnliches. Wenn die Positionen innerhalb des String immer gleich sind, kannst du mit SUBSTR() arbeiten. Ansonsten müsstest du mal nach "explode mysql" (oder split statt explode) suchen, da sollte es eine umständliche Lösung geben.

    dedlfix.

    1. Hoi!

      Schwer. Es gibt kein explode() oder ähnliches. Wenn die Positionen innerhalb des String immer gleich sind, kannst du mit SUBSTR() arbeiten. Ansonsten müsstest du mal nach "explode mysql" (oder split statt explode) suchen, da sollte es eine umständliche Lösung geben.

      Ja. Das arbeitet mit Replace. Find ich eher unschoen.

      --
      Signaturen sind bloed.