Заказ столбца varchar в MySQL в стиле Excel - PullRequest
1 голос
/ 09 ноября 2010

У меня есть столбец varchar со смешанными строками данных, целыми числами, десятичными числами, пустыми строками и нулевыми значениями. Я хотел бы отсортировать столбец так же, как в Excel, сначала отсортировать числа, а затем отсортировать строки. Например:

  • 1
  • 2
  • 3
  • 3,5
  • 10
  • 11
  • 12
  • алан
  • боб
  • 1022 * деревенщина *
  • (пустой / пустой)
  • (пустой / пустой)

Я пытался сделать что-то вроде 'ORDER BY my_column + 0', который сортирует числа правильно, но не по строкам. Я надеялся, что кто-то может знать эффективный способ сделать это.

Предложение MartinofD работает по большей части, и если я немного расширю его, я смогу получить именно то, что хочу:

ВЫБРАТЬ ОТ теста СОРТИРОВАТЬ ПО НЕДЕЙСТВИТЕЛЬНО ИЛИ А = '', a <> '0' И a = 0, а + 0, а;

Довольно уродливо, хотя я не уверен, есть ли лучшие варианты.

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

Это работает:

SELECT a FROM test ORDER BY a IS NULL OR a='', a<>'0' AND a=0, a+0, a;

Однако будет приветствоваться любое более эффективное / элегантное решение.

1 голос
/ 09 ноября 2010

Это потому, что my_column+0 равно для всех строк (0).

Просто используйте ORDER BY my_column+0, my_column

mysql> SELECT a FROM test ORDER BY a+0, a;
+-------+
| a     |
+-------+
| NULL  |
| alan  |
| bob   |
| carl  |
| david |
| 1     |
| 2     |
| 3     |
| 3.5   |
| 10    |
| 11    |
| 12    |
+-------+
12 rows in set (0.00 sec)

Если вам строго нужно, чтобы числа были над строками, вот решение (хотя я не уверен, насколько быстро это будет на больших столах) :

mysql> SELECT a FROM test ORDER BY (a = CONCAT('', 0+a)) DESC, a+0, a;
+-------+
| a     |
+-------+
| 1     |
| 2     |
| 3     |
| 3.5   |
| 10    |
| 11    |
| 12    |
| alan  |
| bob   |
| carl  |
| david |
| NULL  |
+-------+
12 rows in set (0.00 sec)
...