Cast int a varchar


119

Tengo la siguiente consulta y necesito transmitir idavarchar

Esquema

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

Lo que intenté

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

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

pero no funcionan. Por favor recomiende.


4
La próxima vez asegúrese de incluir el mensaje de error real que está viendo. Eso suele ayudar mucho a averiguar qué está mal. Esta vez tuvo suerte de que muchos de nosotros supiéramos lo que está pasando aquí.
Aaron

Respuestas:


218

Necesitará casto convertcomo un CHARtipo de datos, no hay ningún varchartipo de datos al que pueda enviar / convertir datos:

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

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

Vea el siguiente SQL, en acción, en 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;

Además del hecho de que estaba intentando convertir a un tipo de datos incorrecto, la sintaxis que estaba utilizando convertera incorrecta. La convertfunción usa lo siguiente donde exprestá su columna o valor:

 CONVERT(expr,type)

o

 CONVERT(expr USING transcoding_name)

Su consulta original tenía la sintaxis al revés.


Vale la pena mencionar que no es necesario que proporcione la longitud: tanto la conversión como la conversión permitirán algo similar a la selección de CAST (id como CHAR) como col1 de t9;
Jonathan Sayce

1
@JonathanSayce Es una mala práctica no usar una extensión, sugiero leer Malos hábitos para patear: declarando VARCHAR sin (extensión) por Aaron Bertrand
Taryn

Publicación interesante, gracias @bluefeet, asumí que en el escenario de conversión / conversión habría usado el tamaño que necesitaba en lugar de algo arbitrario.
Jonathan Sayce

@JonathanSayce No estoy demasiado familiarizado con los entresijos de MySQL y es posible que no use algo arbitrario, pero no confiaría en que el motor MySQL sea tan inteligente (sin ofender a MySQL). Para asegurarme de obtener la longitud adecuada, siempre proporcionaría una explícitamente.
Taryn

2
@Pacerier IMO, usar concat()para hacer una conversión no es necesariamente tan intuitivo. Preferiría que mi código sea claro y eso simplemente no tiene mucho sentido.
Taryn

35

Lo estás obteniendo porque VARCHARno es un tipo válido para lanzar. De acuerdo con los documentos de MySQL ( http://dev.mysql.com/doc/refman/5.5/en/cast-functions.html#function_cast ), solo puede transmitir a:

  • BINARIO [(N)]
  • CHAR [(N)]
  • FECHA
  • FECHA Y HORA
  • DECIMAL [(M [, D])]
  • FIRMADO
  • [ENTERO]
  • HORA
  • SIN FIRMAR [INTEGER]

Creo que tu mejor opción es usar CHAR.


no estoy seguro porque uso mysql pero parece que SQL permite varchar stackoverflow.com/a/11989599 aunque su respuesta es correcta para mysql, gracias.
CrandellWS

@Aaron ¿Qué pasa si mi campo es char (1) pero quiero convertirlo en enum ('m', 'f')?
dinesh kandpal

17

si

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

es postgresql, ¡pero mySql no lo permite!

atajo en mySql:

SELECT concat(id, '') FROM some_table;

1
Oye, SELECCIONA concat (id, '') FROM some_table; es un buen truco para MySQL, ¡gracias!
Charles Cavalcante

Sí, eso es todo
George Garchagudashvili

3

No tengo MySQL, pero hay RDBMS (Postgres, entre otros) en los que puedes usar el hack

SELECT id || '' FROM some_table;

El concatenar realiza una conversión implícita.


1
Sin embargo, Postgres tiene la conversión clara y concisa, ":: data_type". Sería una lástima no usar el camino correcto aquí. Aunque el concat de Mysql o +0 están justificados
AdrianBR

2

Resolví un problema para comparar una columna entera xa varcharcolumna con

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



0

Estaré respondiendo a esto en términos generales, y muy agradecido a los contribuyentes anteriores.
Estoy usando MySQL en MySQL Workbench. Tuve un problema similar al tratar de concatenar ay charan intjuntos usando el GROUP_CONCATmétodo. En resumen, lo que me ha funcionado es esto:

digamos que tu chares 'c' y intes 'i', entonces, la consulta se convierte en:
...GROUP_CONCAT(CONCAT(c,' ', CAST(i AS CHAR))...


0

Debería poder hacer algo como esto también:

Select (id :> VARCHAR(10)) as converted__id_int
from t9 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.