Seite 1 von 1

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

Verfasst: 01.09.2016 16:17:59
von Meillo
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?

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

Verfasst: 01.09.2016 16:49:18
von heisenberg
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.

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

Verfasst: 01.09.2016 19:37:20
von pferdefreund
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=#

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

Verfasst: 02.09.2016 12:01:36
von Meillo
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.

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

Verfasst: 05.10.2016 14:36:18
von Meillo
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.