Cast int para varchar

119

Tenho a consulta abaixo e preciso transmitir idparavarchar

Esquema

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

O que eu tentei

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

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

mas eles não funcionam. Por favor sugira.

Mario
fonte
4
Da próxima vez, certifique-se de incluir a mensagem de erro real que você está vendo. Isso geralmente ajuda muito a descobrir o que está errado. Desta vez você teve sorte porque muitos de nós simplesmente sabemos o que está acontecendo aqui.
Aaron

Respostas:

218

Você precisará de castou convertcomo um CHARtipo de dados, não há nenhum varchartipo de dados para o qual você possa converter / converter dados:

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

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

Veja o seguinte SQL - em ação - em 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;

Além do fato de que você estava tentando converter para um tipo de dados incorreto, a sintaxe para a qual estava usando convertestava incorreta. A convertfunção usa o seguinte onde exprestá sua coluna ou valor:

 CONVERT(expr,type)

ou

 CONVERT(expr USING transcoding_name)

Sua consulta original tinha a sintaxe invertida.

Taryn
fonte
Pode ser importante mencionar que você não precisa fornecer o comprimento - tanto o elenco quanto o convert permitirão algo semelhante a selecionar CAST (id como CHAR) como col1 de t9;
Jonathan Sayce
1
@JonathanSayce É uma má prática não usar um comprimento, sugiro ler Maus hábitos para chutar: declarando VARCHAR sem (comprimento) por Aaron Bertrand
Taryn
Postagem interessante - obrigado @bluefeet - eu presumi que no cenário de conversão / conversão ele usaria o tamanho necessário ao invés de algo arbitrário.
Jonathan Sayce
@JonathanSayce Não estou muito familiarizado com os meandros do MySQL e ele pode não usar algo arbitrário, mas eu não confiaria no mecanismo do MySQL para ser tão inteligente (sem ofensa ao MySQL). Para ter certeza de que você obterá o comprimento adequado, sempre forneceria um explicitamente.
Taryn
2
@Pacerier IMO, usar concat()para fazer uma conversão não é necessariamente tão intuitivo. Eu prefiro que meu código seja claro e isso simplesmente não faz muito sentido.
Taryn
35

Você está recebendo isso porque VARCHARnão é um tipo válido para lançar. De acordo com os documentos do MySQL ( http://dev.mysql.com/doc/refman/5.5/en/cast-functions.html#function_cast ), você só pode transmitir para:

  • BINÁRIO [(N)]
  • CHAR [(N)]
  • ENCONTRO
  • DATA HORA
  • DECIMAL [(M [, D])]
  • ASSINADO
  • [INTEIRO]
  • TEMPO
  • NÃO ASSINADO [INTEGER]

Acho que sua melhor aposta é usar CHAR.

Aaron
fonte
não tenho certeza porque eu uso o mysql, mas parece que o SQL permite varchar stackoverflow.com/a/11989599 embora sua resposta seja correta para mysql, obrigado.
CrandellWS de
@Aaron E se meu campo for char (1), mas eu quiser convertê-lo em enum ('m', 'f') ??
dinesh kandpal,
17

sim

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

é postgresql, mas mySql não permite isso!

atalho em mySql:

SELECT concat(id, '') FROM some_table;
Nancy
fonte
1
Ei, SELECT concat (id, '') FROM alguma_tabela; é um bom hack para MySQL, obrigado!
Charles Cavalcante
Sim, é isso
George Garchagudashvili
3

Não tenho MySQL, mas existem RDBMS (Postgres, entre outros) em que você pode usar o hack

SELECT id || '' FROM some_table;

O concatenado faz uma conversão implícita.

Andrew Lazarus
fonte
1
Postgres tem um lançamento claro e conciso, ":: data_type". Seria uma pena não usar o caminho adequado aqui. Concat de Mysql ou +0 embora sejam justificados
AdrianBR
2

Resolvi um problema de comparação de uma coluna inteira da coluna xa varcharcom

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

user6348455
fonte
0

usar :

SELECT cast(CHAR(50),id) as colI1 from t9;
user2132046
fonte
0

Estarei respondendo a isso em termos gerais, e muito grato aos contribuintes acima.
Estou usando o MySQL no MySQL Workbench. Eu tive um problema semelhante ao tentar concatenar um chare um intjuntos usando o GROUP_CONCATmétodo. Em resumo, o que funcionou para mim é o seguinte:

digamos que seu charé 'c' e inté 'i', então, a consulta se torna:
...GROUP_CONCAT(CONCAT(c,' ', CAST(i AS CHAR))...

HB
fonte
0

Deve ser capaz de fazer algo assim também:

Select (id :> VARCHAR(10)) as converted__id_int
from t9 
John Drinane
fonte