2015-12-30 3 views
0

Вот моя проблема. У меня есть таблица, такие как:MySQL Varchar Сортировка как Int

+-----------+--------+ 
| data  | number | 
+-----------+--------+ 
| Something | NULL | 
| Test  | 1  | 
| Another | 5  | 
| Testy  | 22  | 
| Tester | NULL | 
| Test2  | 3  | 
+-----------+--------+ 

Поле Number имеет тип VARCHAR, и мне нужно отсортировать по этому столбцу. Я не могу сделать одеяло CAST, потому что мне нужно сохранить значения NULL; Я не хочу превращать их в 0.

Вот что я пытался до сих пор:

IF (number != NULL, CAST(number AS UNSIGNED), number) as int_number 

+

ORDER BY int_number 

Но это не работает, я предполагаю, потому что CAST может только эффект колонки в целом, а не каждое значение на индивидуальной основе.

Я не могу преобразовать эту колонку в поле INT по причинам, которые я не могу здесь объяснить.

Прошу протестировать любые ответы, которые вы придумали. Ответ, который я считаю правильным, не будет первым ответом, который я вижу, если он уже не был протестирован и не работает.

+3

Sth like [ здесь] (http://sqlfiddle.com/#!9/df31f/7/0)? 'SELECT * FROM tab ORDER BY CAST (номер AS UNSIGNED)' – lad2025

+0

Так что нуль будет отображаться перед всеми цифрами или после? –

+0

@AbhikChakraborty Перед всеми номерами – lad2025

ответ

1

NULL должен появиться перед всеми числами

Один простой способ достичь его просто использовать CAST:

SELECT * FROM tab ORDER BY CAST(number AS UNSIGNED) 

SqlFiddleDemo

Выход:

╔════════════╦════════╗ 
║ data  ║ number ║ 
╠════════════╬════════╣ 
║ Something ║ (null) ║ 
║ Tester  ║ (null) ║ 
║ Test  ║ 1  ║ 
║ Test2  ║ 3  ║ 
║ Another ║ 5  ║ 
║ Testy  ║ 22  ║ 
╚════════════╩════════╝ 

Вам следует рассмотреть возможность изменения типа данных до INT, если это возможно.


Другой способ заключается в использовании неявного преобразования в Abhik Chakraborty предложенного в комментарии:

SELECT * FROM tab ORDER BY number + 0 
1

Функции CAST() и CONVERT() не преобразуют значения null в 0, для этого вам нужно использовать IFNULL() или COALESCE(). Таким образом, вы можете сделать order by cast(fieldname as signed integer), чтобы оставить нулевые значения неповрежденными.

1

использовать этот

IF (number IS NOT NULL, CAST(number AS UNSIGNED), NULL) AS int_number 

Примечание:

NULL значения не могут использоваться с большинством операторы сравнения. Например, =,>,> =, < =, <, или! = Не может использоваться, поскольку любое сравнение с NULL всегда возвращает значение NULL, никогда не верно (1) или false (0)

+1

Это почти то же самое, что я опубликовал в качестве проверенного решения. –

+0

@ Nathan Robb - значения NULL ** не могут использоваться ** с большинством операторов сравнения. Например, =,>,> =, <=, <, или! = Не может использоваться, поскольку любое сравнение с NULL всегда возвращает значение NULL, никогда не истинное (1) или false (0). –

+0

см. Это: SELECT \ N = NULL, \ N NULL; –

Смежные вопросы