SQL: Seltsames order by (id+0) -- kennt das wer?

Smalltalk
Antworten
Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

SQL: Seltsames order by (id+0) -- kennt das wer?

Beitrag von Meillo » 01.09.2016 16:17:59

Hoi,

ich bin auf folgenden SQL-Befehl gestossen:

Code: Alles auswählen

select * from user order by (id+0);
Nun frage ich mich, was dieses ``(id+0)'' bedeuten koennte.

So ein Konstrukt kenne ich halt von dynamisch typisierten Sprachen, wenn man den Wert der Variablen als Zahl interpraetiert haben will (analog zu id+"", das man verwendet wenn man ihn als String interpraetiert haben will). Hier macht das aber keinen mir ersichtlichen Sinn. Allerdings beklagt sich Mysql auch nicht und das Ergebnis ist nach id sortiert.

Vermutlich ist darum einfach nur ``order by id'' gemeint, aber vielleicht kenne ich irgendwelche Feinheiten von Mysql nicht.

Hat jemand von euch eine Idee?
Use ed once in a while!

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: SQL: Seltsames order by (id+0) -- kennt das wer?

Beitrag von heisenberg » 01.09.2016 16:49:18

Ja, würde ich auch so einschätzen. Wenn in id irgend ein Müll drin steht, dann wird da evtl. eine Konvertierung in eine Zahl durchgeführt, die den Müll wahrscheinlich in 0 umwandelt.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

pferdefreund
Beiträge: 3791
Registriert: 26.02.2009 14:35:56

Re: SQL: Seltsames order by (id+0) -- kennt das wer?

Beitrag von pferdefreund » 01.09.2016 19:37:20

Unter Postgresql funktioniert das nur, wenn der Sortierbegriff numerisch ist, was aus meiner Sicht korrekt ist. Ein order by (feld+0) gibt einen Fehler, so Feld nicht numerisch ist.
ERROR: operator does not exist: text + integer
LINE 1: select * from pferd order by (bemerkungen+0);
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
pferdedb=#

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: SQL: Seltsames order by (id+0) -- kennt das wer?

Beitrag von Meillo » 02.09.2016 12:01:36

Danke fuer die Meinungen. Die Spalte ist vom Typ int. Damit steht dort nichts anderes drin als Ganzzahlen und damit scheint mir das +0 keine Auswirkung zu haben. Ich denke, ich werde es einfach entfernen.
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8782
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: SQL: Seltsames order by (id+0) -- kennt das wer?

Beitrag von Meillo » 05.10.2016 14:36:18

Jetzt habe ich herausgefunden was der Unterschied ist:

In einer Spalte mit einem Stringtyp wird mit ``order by id'' alphabetisch sortiert. Mit ``order by (id+0)'' aber numerisch.

Code: Alles auswählen

mysql> desc lookup;
+-------------+---------------------+------+-----+---------+-------+
| Field       | Type                | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+-------+
| id          | varchar(50)         | NO   | PRI | NULL    |       |
...

Code: Alles auswählen

mysql> select id from lookup order by id ;
+-------+
| id    |
+-------+
| 0     |
| 1     |
| 10    |
| 11    |
| 12    |
| 13    |
| 14    |
| 15    |
| 16    |
| 17    |
| 18    |
| 19    |
| 2     |
| 20    |
| 21    |
| 22    |
| 226   |
| 23    |
| 24    |
| 25    |
| 26    |
| 27    |
| 29    |
| 3     |
| 30    |
| 31    |
| 32    |
| 33    |
| 4     |
| 5     |
| 6     |
| 7     |
| 8     |
| 9     |
| test1 |
| test2 |
| test3 |
+-------+

Code: Alles auswählen

mysql> select id from lookup order by (id+0) ;
+-------+
| id    |
+-------+
| 0     |
| test2 |
| test1 |
| test3 |
| 1     |
| 2     |
| 3     |
| 4     |
| 5     |
| 6     |
| 7     |
| 8     |
| 9     |
| 10    |
| 11    |
| 12    |
| 13    |
| 14    |
| 15    |
| 16    |
| 17    |
| 18    |
| 19    |
| 20    |
| 21    |
| 22    |
| 23    |
| 24    |
| 25    |
| 26    |
| 27    |
| 29    |
| 30    |
| 31    |
| 32    |
| 33    |
| 226   |
+-------+
Bei numerischen Spalten gibt es keinen Unterschied. Dort kann man aber umgekehrt mit ``concat(id, "")'' eine alphabetische Sortierung erzwingen.

Jedenfalls ist das bei Mysql-5.5 so.
Use ed once in a while!

Antworten