sql >> Databáze >  >> RDS >> Mysql

Třídicí sloupec řetězce obsahující čísla v SQL?

Jdeme na předpoklad vždy je to WORD_space_NUMBER, mělo by to fungovat:

SELECT   *
FROM     table
ORDER BY CAST(SUBSTRING(column,LOCATE(' ',column)+1) AS SIGNED)

Použijte POSITION k nalezení prostoru SUBSTRING uchopit číslo za ním a ODEJÍT aby to byla srovnatelná hodnota.

Pokud je ve sloupci jiný vzor, ​​dejte mi vědět a já se pokusím vymyslet lepší řešení.

UPRAVIT Prokazatelně fungují:

mysql> INSERT INTO t (st) VALUES ('a 1'),('a 12'),('a 6'),('a 11');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM t ORDER BY st;
+----+------+
| id | st   |
+----+------+
|  1 | a 1  |
|  4 | a 11 |
|  2 | a 12 |
|  3 | a 6  |
+----+------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM t ORDER BY CAST(SUBSTRING(st,LOCATE(' ',st)+1) AS SIGNED);
+----+------+
| id | st   |
+----+------+
|  1 | a 1  |
|  3 | a 6  |
|  4 | a 11 |
|  2 | a 12 |
+----+------+

mysql> INSERT INTO t (st) VALUES ('b 1'),('b 12'),('b 6'),('b 11');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM t ORDER BY CAST(SUBSTRING(st,LOCATE(' ',st)+1) AS SIGNED);
+----+------+
| id | st   |
+----+------+
|  1 | a 1  |
|  5 | b 1  |
|  3 | a 6  |
|  7 | b 6  |
|  4 | a 11 |
|  8 | b 11 |
|  2 | a 12 |
|  6 | b 12 |
+----+------+
8 rows in set (0.00 sec)

mysql> SELECT * FROM t ORDER BY LEFT(st,LOCATE(' ',st)), CAST(SUBSTRING(st,LOCATE(' ',st)+1) AS SIGNED);
+----+------+
| id | st   |
+----+------+
|  1 | a 1  |
|  3 | a 6  |
|  4 | a 11 |
|  2 | a 12 |
|  5 | b 1  |
|  7 | b 6  |
|  8 | b 11 |
|  6 | b 12 |
+----+------+
8 rows in set (0.00 sec)

ignorovat moje lame názvy tabulek/sloupců, ale dává mi správný výsledek. Také jsme šli o něco dále a přidali dvojité řazení pro rozdělení předpony písmen na číselné.

Upravit SUBSTRING_INDEX bude trochu čitelnější.

ORDER BY SUBSTRING_INDEX(st, " ", 1) ASC, CAST(SUBSTRING_INDEX(st, " ", -1) AS SIGNED)


  1. Nechejte (znovu) automatické zvyšování ID MySQL od 1

  2. Nahradit hodnoty null v SQL pomocí příkazu select v mysql?

  3. Jak vytvořit uživatele v Oracle 11g a udělit oprávnění

  4. PHP:mysql_connect nevrací hodnotu FALSE