Announcement

Collapse
No announcement yet.

Unterscheidung in ORDER BY Klausel

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Unterscheidung in ORDER BY Klausel

    Hallo zusammen,

    ich suche die richtige MySQL5-Syntax für die Sortiereung zwischen numerischen und alphanumerischen werten in der ORDER BY Klausel:

    Code:
    SELECT products_model
    FROM products
    ORDER BY
    -> wenn products_model numerisch
    (products_model + 0) ASC
    -> sonst (alphanumerisch)
    products_model ASC
    Als Bedingung für numerisch könnte products_model REGEXP '^[0-9]' dienen, aber wie lautet die Syntax?

  • #2
    Hallo,

    mit CASE oder IF solltest du zurechtkommen.

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      REGEXP wird nicht interpretiert

      Hallo Falk,

      danke für den Tipp.
      Ich habe es bereits mit IF und CASE versucht, jedoch wird die REGEXP-Anweisung nicht interpretiert:

      Code:
      SELECT products_model FROM products
      ORDER BY
      IF(products_model REGEXP '[a-zA-Z]',  products_model, (products_model + 0)) ASC
      Code:
      SELECT products_model FROM products
      ORDER BY
      CASE
          WHEN products_model REGEXP '[a-zA-Z]' THEN products_model
          ELSE (products_model + 0)
      END
      ASC
      Beim Ausführen wird immer die erste Anweisung verwendet, also products_model und (produts_model + 0) kommt nie zum Zug, auch wenn sich Buchstaben in products_model befinden.

      Lässt sich REGEXP bei IFi und CASE überhaupt verwenden?
      Gibt es eine Alternative zu REGEXP?

      Danke und Gruß Boogie

      Comment


      • #4
        Originally posted by Boogie View Post
        ...Beim Ausführen wird immer die erste Anweisung verwendet, also products_model und (produts_model + 0) kommt nie zum Zug, auch wenn sich Buchstaben in products_model befinden.
        Hast du da vlt. einen Denkfehler?
        Du prüfst mit deiner Regex ob products_model einen Buchstaben enthält und wenn ja soll er products_model ausgeben. Wenn Nein, also products_model enthält nur Zahlen (und/oder Sonderzeichen), dann wird eine numerische Null addiert. Welchen Sinn macht das? Kurz gesprochen: Ist es ein Wort gib es unverändert aus, ist es eine Zahl addiere 0 und gib sie aus - eine Zahl + 0 ist immer noch diesselbe Zahl. Das IF() ist sinnlos, es verändert den Wert NIE.

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Wenn ich das Ganze richtig verstehe, willst du
          Code:
          123
          abc
          123abc
          20bbc
          def
          wie folgt sortiert haben
          Code:
          20bbc
          123
          123abc
          abc
          def
          Code:
          ORDER BY products_model * 1 = 0, products_model * 1, products_model
          Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

          Comment


          • #6
            Perfekt!

            Hallo Falk,

            genau danach habe ich gesucht, es funktioniert!

            Damit ich das verstehe:

            products_model * 1 = 0 sortiert die alphanumerichen Werte
            products_model * 1 sortiert die numerischen Werte mit führender null, in dem es die führenden Nullen entfernt

            Korrigiere mich bitte, wenn ich falsch liege.

            Zu Deiner Frage: eine 0 auf einen Wert zu addieren bewirkt genau das selbe wie, den Wert mit 1 zu multiplizieren. Der wert wird numerisch wird.
            Z.B.
            wert wert *1 wert +0
            000175 175.0 175.0

            Ich habe bei der Problemlösung programmiertechnisch an Kontrollstrukturen gedacht und nicht daran, dass SQL mit Werten arbeitet.

            Tausend Dank
            Gruß Boogie

            Comment


            • #7
              Originally posted by Boogie View Post
              Hallo Falk,
              Ich bin zwar nicht Falk, aber ok.

              Originally posted by Boogie View Post
              products_model * 1 = 0 sortiert die alphanumerichen Werte
              products_model * 1 implizit ein automatischen Cast auf numerisch, soweit dieses Möglich ist, beim ersten nicht numerischen Zeichen ist Schluss (123abc * 1 ergibt also 123, abc ergibt 0 da kein Cast möglich ist),der Vergleich mit 0 sorgt also dafür das Werte welche nicht Umgewandelt werden können zum Schluss eingeordnet werden.

              Originally posted by Boogie View Post
              products_model * 1 sortiert die numerischen Werte mit führender null, in dem es die führenden Nullen entfernt
              Achtung, führende 0en (0 ist was anderes als NULL), können u.U als Oktalzahlen interpretiert werden.
              Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

              Comment


              • #8
                Hi dibo33,
                danke für die nachvollziehbaren Erläuterungen. Schnell und unkompliziert, das lobe ich mir!
                Gruß Boogie

                Comment

                Working...
                X