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.


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.


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.


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;

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.


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



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))...


0

Deve ser capaz de fazer algo assim também:

Select (id :> VARCHAR(10)) as converted__id_int
from t9 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.