Cast int zu varchar

119

Ich habe unten Abfrage und Notwendigkeit, Guss idzuvarchar

Schema

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

Was ich versucht habe

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

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

aber sie funktionieren nicht. Bitte vorschlagen.

Mario
quelle
4
Stellen Sie beim nächsten Mal sicher, dass die tatsächliche Fehlermeldung angezeigt wird, die angezeigt wird. Das hilft normalerweise sehr dabei, herauszufinden, was falsch ist. Diesmal hatten Sie Glück, dass viele von uns zufällig wissen, was hier los ist.
Aaron

Antworten:

218

Sie müssen castoder convertals CHARDatentyp, es gibt keinen varcharDatentyp, in den Sie Daten umwandeln / konvertieren können:

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

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

Sehen Sie sich das folgende SQL - in Aktion - bei SQL Fiddle an :

/*! 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;

Abgesehen von der Tatsache, dass Sie versucht haben, in einen falschen Datentyp zu konvertieren, war die Syntax, für die Sie verwendet haben, convertfalsch. Die convertFunktion verwendet Folgendes, wo exprsich Ihre Spalte oder Ihr Wert befindet:

 CONVERT(expr,type)

oder

 CONVERT(expr USING transcoding_name)

Ihre ursprüngliche Abfrage hatte die Syntax rückwärts.

Taryn
quelle
Es könnte erwähnenswert sein, dass Sie die Länge nicht angeben müssen - sowohl Cast als auch Convert erlauben etwas in der Art von Select CAST (ID als CHAR) als col1 von t9;
Jonathan Sayce
1
@ JonathanSayce Es ist eine schlechte Praxis, keine Länge zu verwenden. Ich empfehle, schlechte Gewohnheiten zu lesen , um zu treten: VARCHAR ohne (Länge) zu erklären von Aaron Bertrand
Taryn
Interessanter Beitrag - danke @bluefeet - Ich hatte im Cast / Convert-Szenario angenommen, dass er die benötigte Größe verwendet hätte und nicht etwas Willkürliches.
Jonathan Sayce
@JonathanSayce Ich bin mit den Vor- und Nachteilen von MySQL nicht allzu vertraut und es wird möglicherweise nichts Beliebiges verwendet, aber ich würde mich nicht darauf verlassen, dass die MySQL-Engine so intelligent ist (keine Beleidigung für MySQL). Um sicherzugehen, dass Sie die richtige Länge erhalten, würde ich immer explizit eine angeben.
Taryn
2
@Pacerier IMO, das Verwenden concat()einer Konvertierung ist nicht unbedingt so intuitiv. Ich würde es vorziehen, wenn mein Code klar ist und das macht einfach nicht viel Sinn.
Taryn
35

Du bekommst das, weil VARCHARes kein gültiger Typ ist, in den du dich verwandeln kannst . Gemäß den MySQL-Dokumenten ( http://dev.mysql.com/doc/refman/5.5/en/cast-functions.html#function_cast ) können Sie nur Folgendes übertragen:

  • BINARY [(N)]
  • CHAR [(N)]
  • DATUM
  • TERMINZEIT
  • DEZIMAL [(M [, D])]
  • UNTERZEICHNET
  • [GANZE ZAHL]
  • ZEIT
  • UNSIGNED [INTEGER]

Ich denke, Ihre beste Wahl ist zu verwenden CHAR.

Aaron
quelle
Ich bin mir nicht sicher, weil ich MySQL verwende, aber es scheint, als ob SQL varchar stackoverflow.com/a/11989599 zulässt, obwohl Ihre Antwort für MySQL korrekt ist, danke.
CrandellWS
@ Aaron Was ist, wenn mein Feld char (1) ist, ich es aber in enum ('m', 'f') konvertieren möchte?
Dinesh Kandpal
17

Ja

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

ist postgresql, aber mySql erlaubt das nicht!

Abkürzung in mySql:

SELECT concat(id, '') FROM some_table;
Nancy
quelle
1
Hey, SELECT concat (id, '') FROM some_table; ist ein guter Hack für MySQL, danke!
Charles Cavalcante
Ja, das war's
George Garchagudashvili
3

Ich habe kein MySQL, aber es gibt RDBMS (unter anderem Postgres), in denen Sie den Hack verwenden können

SELECT id || '' FROM some_table;

Die Verkettung führt eine implizite Konvertierung durch.

Andrew Lazarus
quelle
1
Postgres hat jedoch das klare und prägnante Casting ":: data_type". Es wäre eine Schande, hier nicht den richtigen Weg zu gehen. Mysqls Concat oder +0 sind jedoch gerechtfertigt
AdrianBR
2

Ich habe ein Problem beim Vergleichen einer Ganzzahlspalte xa varcharmit gelöst

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

user6348455
quelle
0

verwenden :

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

Ich werde dies allgemein beantworten und den oben genannten Mitwirkenden sehr dankbar sein.
Ich verwende MySQL auf MySQL Workbench. Ich hatte ein ähnliches Problem beim Versuch, a charund a intmithilfe der GROUP_CONCATMethode miteinander zu verknüpfen . Zusammenfassend hat Folgendes für mich funktioniert:

Nehmen wir an, Sie charsind 'c' und int'i'. Die Abfrage lautet also:
...GROUP_CONCAT(CONCAT(c,' ', CAST(i AS CHAR))...

HB
quelle
0

Sollte in der Lage sein, so etwas auch zu tun:

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