Trasmetti int a varchar


119

Ho una query di seguito e devo trasmettere idavarchar

Schema

create table t9 (id int, name varchar (55));
insert into t9( id, name)values(2, 'bob');

Quello che ho provato

select CAST(id as VARCHAR(50)) as col1 from t9;

select CONVERT(VARCHAR(50),id) as colI1 from t9;

ma non funzionano. Per favore suggerisci.


4
La prossima volta assicurati di includere il messaggio di errore effettivo visualizzato. Questo di solito aiuta molto a capire cosa c'è che non va. Questa volta sei stato fortunato che molti di noi sapessero cosa sta succedendo qui.
Aaron

Risposte:


218

Avrai bisogno di casto convertcome CHARtipo di dati, non esiste un varchartipo di dati in cui puoi eseguire il cast / convertire i dati:

select CAST(id as CHAR(50)) as col1 
from t9;

select CONVERT(id, CHAR(50)) as colI1 
from t9;

Vedi il seguente SQL - in azione - su SQL Fiddle :

/*! Build Schema */
create table t9 (id INT, name VARCHAR(55));
insert into t9 (id, name) values (2, 'bob');

/*! SQL Queries */
select CAST(id as CHAR(50)) as col1 from t9;
select CONVERT(id, CHAR(50)) as colI1 from t9;

Oltre al fatto che stavi cercando di convertire in un tipo di dati errato, la sintassi che stavi usando per convertnon era corretta. La convertfunzione utilizza quanto segue dove si exprtrova la colonna o il valore:

 CONVERT(expr,type)

o

 CONVERT(expr USING transcoding_name)

La tua query originale aveva la sintassi al contrario.


Vale la pena ricordare che non è necessario fornire la lunghezza: sia cast che convert permetteranno qualcosa sulla falsariga di selezionare CAST (id as CHAR) come col1 da t9;
Jonathan Sayce

1
@JonathanSayce È una cattiva pratica non usare una lunghezza, suggerisco di leggere Cattive abitudini per calciare: dichiarare VARCHAR senza (lunghezza) di Aaron Bertrand
Taryn

Interessante post - grazie @bluefeet - avevo pensato che nello scenario cast / convert avrebbe usato la dimensione di cui aveva bisogno piuttosto che qualcosa di arbitrario.
Jonathan Sayce

@JonathanSayce Non ho molta familiarità con i dettagli di MySQL e potrebbe non usare qualcosa di arbitrario, ma non farei affidamento sul motore MySQL per essere così intelligente (senza offesa per MySQL). Per essere sicuro di ottenere la lunghezza corretta, ne fornirei sempre una esplicitamente.
Taryn

2
@Pacerier IMO, usare concat()per fare una conversione non è necessariamente così intuitivo. Preferirei che il mio codice fosse chiaro e questo non ha molto senso.
Taryn

35

Lo capisci perché VARCHARnon è un tipo valido in cui eseguire il cast. Secondo i documenti MySQL ( http://dev.mysql.com/doc/refman/5.5/en/cast-functions.html#function_cast ) puoi trasmettere solo a:

  • BINARIO [(N)]
  • CHAR [(N)]
  • DATA
  • APPUNTAMENTO
  • DECIMAL [(M [D])]
  • FIRMATO
  • [NUMERO INTERO]
  • TEMPO
  • UNSIGNED [INTEGER]

Penso che la soluzione migliore sia usare CHAR.


non sono sicuro perché uso mysql ma sembra che SQL consenta varchar stackoverflow.com/a/11989599 sebbene la tua risposta sia corretta per mysql, grazie.
CrandellWS

@Aaron E se il mio campo è char (1) ma voglio convertirlo in enum ('m', 'f') ??
dinesh kandpal

17

SELECT id || '' FROM some_table;
or SELECT id::text FROM some_table;

è postgresql, ma mySql non lo consente!

scorciatoia in mySql:

SELECT concat(id, '') FROM some_table;

1
Ehi, SELEZIONA concat (id, '') FROM some_table; è un buon trucco per MySQL, grazie!
Charles Cavalcante

Sì, è così
George Garchagudashvili

3

Non ho MySQL, ma ci sono RDBMS (Postgres, tra gli altri) in cui puoi usare l'hack

SELECT id || '' FROM some_table;

Il concatenato esegue una conversione implicita.


1
Postgres ha però il casting chiaro e conciso, ":: data_type". Sarebbe un peccato non usare il modo corretto qui. Il concatenamento di Mysql o +0 sono giustificati
AdrianBR

2

Ho risolto un problema confrontando una colonna intera xa varcharcon

where CAST(Column_name AS CHAR CHARACTER SET latin1 ) collate latin1_general_ci = varchar_column_name



0

Risponderò in termini generali e molto grato ai collaboratori di cui sopra.
Sto usando MySQL su MySQL Workbench. Ho avuto un problema simile cercando di concatenare un chare un intinsieme usando il GROUP_CONCATmetodo. In sintesi, ciò che ha funzionato per me è questo:

diciamo che il tuo charè 'c' ed intè 'i', quindi la query diventa:
...GROUP_CONCAT(CONCAT(c,' ', CAST(i AS CHAR))...


0

Dovrebbe essere in grado di fare qualcosa del genere anche:

Select (id :> VARCHAR(10)) as converted__id_int
from t9 
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.