MySQL order by (str to int)
SELECT `01` FROM perf WHERE year = '2013' order by CAST(`01` AS INT) LIMIT 3
01 имеет числовые значения как varchar. Мне нужно заказать топ-3 '01' как целое. Почему этот запрос не работает?
таблица, как это:
+----------------------+
| name | 01 | 02 | year|
+----------------------+
|name1 | 90 |*** |2013 |
+----------------------+
|name2 | 93 | 55 |2013 |
+----------------------+
|name3 |*** | 78 |2013 |
+----------------------+
запрос должен приказать 01 (уволить *) и дать имена и значения.
1 ответов
MySQL не позволяет вам CAST('01' AS INT)
. Он ожидает вместо SIGNED
или UNSIGNED
.
SELECT `01` FROM perf WHERE year = '2013' order by CAST(`01` AS SIGNED) LIMIT 3
обзор MySQL docs on CAST()
для полной информации.
mysql> SELECT CAST('01' AS SIGNED);
+----------------------+
| CAST('01' AS SIGNED) |
+----------------------+
| 1 |
+----------------------+
1 row in set (0.00 sec)
чтобы заставить нечисловые строки сортироваться последними, вам нужно будет применить CASE
на ORDER BY
что придает им абсурдно высокое значение. Условие должно проверить, что значение в 01
не равно 0
, и при применении к SIGNED
в результат не 0
в связи с тем, что нечисловые строки будет приведен к нулю.
если эти условия не выполняются, строка считается нечисловой и задается значение 999999999 в ORDER BY
, что подталкивает их к концу. Впоследствии они заказываются name
.
SELECT * FROM perf
WHERE year = '2013'
ORDER BY
CASE WHEN (`01` <> '0' AND CAST(`01` AS SIGNED) <> 0) THEN CAST(`01` AS SIGNED) ELSE 999999999 END,
name
LIMIT 3
http://sqlfiddle.com/#!2/846e2/6
чтобы сделать этот вид нисходящим, используйте абсурдно низкое значение (отрицательное) вместо высокого значение
CASE WHEN (`01` <> '0' AND CAST(`01` AS SIGNED) <> 0) THEN CAST(`01` AS SIGNED) ELSE -999999999 END DESC,