sql >> Database teknologi >  >> RDS >> Mysql

Sorterer strengkolonne indeholdende tal i SQL?

Går på antagelsen det er altid WORD_space_NUMBER dette burde virke:

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

Brug POSITION for at finde pladsen, SUBSTRING for at få fat i nummeret efter det, og CAST a> for at gøre det til en sammenlignelig værdi.

Hvis der er et andet mønster til kolonnen, så lad mig det vide, så vil jeg prøve at finde en bedre løsning.

REDIGER Bevist at virke:

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)

ignorer mine lamme tabel-/kolonnenavne, men giver mig det korrekte resultat. Gik også lidt længere og tilføjede dobbelt sortering for at bryde bogstavpræfiks med numerisk.

Rediger SUBSTRING_INDEX vil gøre det lidt mere læsbart.

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


  1. 13 Bedste praksis for SQL Server-sikkerhed

  2. Henter indekset for en indsat række

  3. c3p0 maxIdleTime er det samme som wait_timeout af mysql?

  4. Tips til opgradering af Percona XtraDB Cluster til 8.0