Converti il ​​testo in numero nella query MySQL


138

È possibile convertire il testo in numero all'interno della query MySQL? Ho una colonna con un identificatore che consiste in un nome e un numero nel formato di "nome-numero". La colonna ha il tipo VARCHAR. Voglio ordinare le righe in base al numero (righe con lo stesso nome) ma la colonna viene ordinata in base all'ordine dei caratteri, ad es

name-1
name-11
name-12
name-2

Se taglio il numero, posso convertire il numero "varchar" nel numero "reale" e usarlo per ordinare le righe? Vorrei ottenere il seguente ordine.

name-1
name-2
name-11
name-12

Non riesco a rappresentare il numero come una colonna separata.

modificato l'11 / 2011/2011 alle 9:32

Ho trovato la seguente soluzione ... ORDER BY column * 1. Se il nome non conterrà alcun numero, è necessario utilizzare questa soluzione?


1
il nome è esattamente il nome o può essere qualsiasi personaggio? Voglio dire: è una stringa lunga quattro caratteri o è un vero nome?
Marco,

namepuò essere qualsiasi sequenza di lettere.
CZZ,

1
possibile duplicato dell'ordinamento naturale mysql
Shakti Singh,

Risposte:


256

Questo dovrebbe funzionare:

SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;

1
potresti aggiungere una spiegazione e un link alla documentazione?
Angelo Fuchs,

La mia stringa è come "nome-abc12". Aggiungendo il codice, funziona solo se i caratteri iniziali dopo "-" non iniziano con una lettera. @Marco Puoi dirmi un modo per ignorare le lettere senza una condizione dove?
Eduardo,

1
@Eduardo la mia query dovrebbe ottenere la stringa dopo il "-" e convertirla in un numero (DEVE essere un numero). Nel tuo caso mi piacerebbe andare su utilizzando un'espressione regolare, probabilmente ...
Marco

@ Marco ha fatto un'espressione regolare, grazie per il suggerimento.
Eduardo,

32

Puoi usare SUBSTRINGe CONVERT:

SELECT stuff
FROM table
WHERE conditions
ORDER BY CONVERT(SUBSTRING(name_column, 6), SIGNED INTEGER);

Dov'è name_columnla colonna con i valori "name-". Il SUBSTRINGrimuove tutto prima che il sesto carattere (cioè il "nome-" prefisso) e poi i CONVERTconvertiti sinistra verso un vero e proprio numero intero.

AGGIORNAMENTO : date le circostanze mutevoli nei commenti (cioè il prefisso può essere qualsiasi cosa), dovrai lanciare un LOCATEmix:

ORDER BY CONVERT(SUBSTRING(name_column, LOCATE('-', name_column) + 1), SIGNED INTEGER);

Questo ovviamente presuppone che il prefisso non numerico non contenga trattini ma il commento pertinente afferma che:

name può essere qualsiasi sequenza di lettere

quindi dovrebbe essere un presupposto sicuro.


Rispondendo al mio commento, ci ha detto che il nome può essere qualsiasi sequenza di caratteri, quindi non sono sicuro che tu possa usarlo SUBSTRING(name_column, 6). Lo so, l'hai pubblicato quando non ci ha detto questo ...
Marco,

@Marco: grazie per l'heads-up, ho aggiunto un aggiornamento che dovrebbe occuparsi delle nuove informazioni sui prefissi. Ma sì, il tuo SUBSTRING_INDEX è più bello.
mu è troppo corto

23

Usa semplicemente CAST,

CAST(column_name AS UNSIGNED)

Il tipo per il risultato del cast può essere uno dei seguenti valori:

BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]

14

Puoi usare CAST () per convertire da stringa a int. per esempioSELECT CAST('123' AS INTEGER);


15
Quella versione è specifica? Devo usarlo SELECT CAST('123' AS SIGNED INTEGER);o SELECT CAST('123' AS UNSIGNED INTEGER);farlo funzionare.
Hobo

10
SELECT *, CAST(SUBSTRING_INDEX(field, '-', -1) AS UNSIGNED) as num FROM tableName ORDER BY num;

1
Sei sicuro che ORDER BY usi num come numero senza usare CONVERT? Non ne sono sicuro, ma può essere ... mi sto solo chiedendo :)
Marco,

4

un modo semplice SELEZIONA '123' + 0


Sebbene questo codice possa essere d'aiuto per risolvere il problema, fornire un contesto aggiuntivo riguardo al perché e / o al modo in cui risponde alla domanda migliorerebbe significativamente il suo valore a lungo termine. Si prega di modificare la risposta di aggiungere qualche spiegazione.
Toby Speight,

Questo non ha risposto alla domanda ma era la risposta che stavo cercando.
Sagar Shah,

la tua soluzione è la più elegante e pratica - sfortunatamente non l'hai fornita nel contesto della domanda con un'espressione specifica per un dato esempio - per favore modificala per essere specifica.
Chukko,


2

se la chiave primaria è una stringa in un formato come

ABC / EFG / EE / 13/123 (numero progressivo)
questo tipo di stringa può essere facilmente utilizzata per l'ordinamento con il delimitatore ("/")

possiamo usare la seguente query per ordinare una tabella con questo tipo di chiave

SELECT * FROM `TABLE_NAME` ORDER BY 
CONVERT(REVERSE(SUBSTRING(REVERSE(`key_column_name`), 1, LOCATE('/', REVERSE(`key_column_name`)) - 1)) , UNSIGNED INTEGER) DESC


-5

Un modo generico per fare:

SELECT * FROM your_table ORDER BY LENTH(your_column) ASC, your_column ASC
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.