sql >> Databasteknik >  >> RDS >> Mysql

Sortera strängkolumn som innehåller siffror i SQL?

Går på antagandet det är alltid WORD_mellanslag_NUMBER detta borde fungera:

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

Använd POSITION för att hitta utrymmet, SUBSTRING för att ta tag i numret efter det och CAST a> för att göra det till ett jämförbart värde.

Om det finns ett annat mönster för kolumnen, låt mig veta så ska jag försöka hitta en bättre lösning.

REDIGERA Bevisat att fungera:

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)

ignorera mina lama tabell-/kolumnnamn, men ger mig rätt resultat. Gick också lite längre och la till dubbelsortering för att bryta bokstäverprefix med numeriska.

Redigera SUBSTRING_INDEX kommer att göra det lite mer läsbart.

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


  1. Ändra SQL-databas misstänkt läge till normalt läge med fråga

  2. Hur man får aktuellt datum och tid i MySQL

  3. UNION ALL Optimering

  4. Hur man kör och konfigurerar ProxySQL 2.0 för MySQL Galera Cluster på Docker