Caster int en varchar

119

J'ai ci - dessous requête et nécessité de casting idàvarchar

Schéma

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

Ce que j'ai essayé

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

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

mais ils ne fonctionnent pas. Veuillez suggérer.

Mario
la source
4
La prochaine fois, assurez-vous d'inclure le message d'erreur réel que vous voyez. Cela aide généralement beaucoup à comprendre ce qui ne va pas. Cette fois, vous avez eu de la chance que nous soyons nombreux à savoir ce qui se passe ici.
Aaron

Réponses:

218

Vous aurez besoin de castou en converttant que CHARtype de données, il n'y a pas de varchartype de données vers lequel vous pouvez convertir / convertir des données:

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

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

Voir le SQL suivant - en action - sur 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;

Outre le fait que vous essayiez de convertir en un type de données incorrect, la syntaxe que vous utilisiez convertétait incorrecte. La convertfonction utilise ce qui suit où exprest votre colonne ou valeur:

 CONVERT(expr,type)

ou

 CONVERT(expr USING transcoding_name)

Votre requête d'origine avait la syntaxe à l'envers.

Taryn
la source
Il vaut peut-être la peine de mentionner que vous n'avez pas à fournir la longueur - à la fois cast et convert autoriseront quelque chose comme select CAST (id as CHAR) comme col1 à partir de t9;
Jonathan Sayce
1
@JonathanSayce C'est une mauvaise pratique de ne pas utiliser de longueur, je suggère de lire Mauvaises habitudes pour botter: déclarer VARCHAR sans (longueur) par Aaron Bertrand
Taryn
Message intéressant - merci @bluefeet - J'avais supposé dans le scénario de conversion / conversion qu'il aurait utilisé la taille dont il avait besoin plutôt que quelque chose d'arbitraire.
Jonathan Sayce
@JonathanSayce Je ne suis pas trop familier avec les tenants et aboutissants de MySQL et il se peut qu'il n'utilise pas quelque chose d'arbitraire, mais je ne compterais pas sur le moteur MySQL pour être aussi intelligent (sans offenser MySQL). Afin d'être sûr que vous obtenez la bonne longueur, je vous en fournirais toujours une explicitement.
Taryn
2
@Pacerier IMO, utiliser concat()pour faire une conversion n'est pas forcément aussi intuitif. Je préférerais que mon code soit clair et cela n'a tout simplement pas beaucoup de sens.
Taryn
35

Vous obtenez cela parce que ce VARCHARn'est pas un type valide dans lequel effectuer un cast. Selon la documentation MySQL ( http://dev.mysql.com/doc/refman/5.5/en/cast-functions.html#function_cast ), vous ne pouvez convertir que:

  • BINAIRE [(N)]
  • CHAR [(N)]
  • DATE
  • DATETIME
  • DÉCIMAL [(M [, D])]
  • SIGNÉ
  • [ENTIER]
  • TEMPS
  • UNSIGNED [INTEGER]

Je pense que votre meilleur pari est d'utiliser CHAR.

Aaron
la source
pas sûr parce que j'utilise mysql mais il semble que SQL autorise varchar stackoverflow.com/a/11989599 bien que votre réponse soit correcte pour mysql, merci.
CrandellWS
@Aaron Que faire si mon champ est char (1) mais que je veux le convertir en enum ('m', 'f') ??
dinesh kandpal
17

Oui

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

est postgresql, mais mySql ne le permet pas!

raccourci dans mySql:

SELECT concat(id, '') FROM some_table;
Nancy
la source
1
Hey, SELECT concat (id, '') FROM some_table; est un bon hack pour MySQL, merci!
Charles Cavalcante
Ouais, c'est ça
George Garchagudashvili
3

Je n'ai pas MySQL, mais il existe des SGBDR (Postgres, entre autres) dans lesquels vous pouvez utiliser le hack

SELECT id || '' FROM some_table;

Le concaténat effectue une conversion implicite.

Andrew Lazarus
la source
1
Postgres a cependant le casting clair et concis, ":: data_type". Ce serait dommage de ne pas utiliser la bonne manière ici. Le concat ou +0 de Mysql est justifié
AdrianBR
2

J'ai résolu un problème de comparaison d'une colonne entière de colonne xa varcharavec

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

user6348455
la source
0

utilisation :

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

Je vais y répondre en termes généraux, et je suis très reconnaissant aux contributeurs ci-dessus.
J'utilise MySQL sur MySQL Workbench. J'ai eu un problème similaire en essayant de concaténer un charet un intensemble en utilisant la GROUP_CONCATméthode. En résumé, ce qui a fonctionné pour moi est le suivant:

disons que votre charest 'c' et intest 'i', donc, la requête devient:
...GROUP_CONCAT(CONCAT(c,' ', CAST(i AS CHAR))...

HB
la source
0

Devrait être capable de faire quelque chose comme ça aussi:

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