Prześlij int na varchar


119

Mam poniżej zapytanie i muszę przesyłać iddovarchar

Schemat

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

Co próbowałem

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

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

ale nie działają. Proszę zasugeruj.


4
Następnym razem pamiętaj, aby podać rzeczywisty komunikat o błędzie, który widzisz. To zwykle bardzo pomaga w ustaleniu, co jest nie tak. Tym razem miałeś szczęście, że wielu z nas po prostu wie, co się tutaj dzieje.
— Aaron

Odpowiedzi:


218

Będziesz musiał castlub convertjako CHARtyp danych, nie ma varchartypu danych, na który możesz rzutować / konwertować dane:

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

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

Zobacz następującą instrukcję SQL - w akcji - w witrynie 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;

Oprócz faktu, że próbujesz przekonwertować dane na niepoprawny typ, składnia, której używałeś, convertbyła niepoprawna. convertFunkcja wykorzystuje następujące gdzie exprjest twoja kolumna lub wartość:

 CONVERT(expr,type)

lub

 CONVERT(expr USING transcoding_name)

Twoje pierwotne zapytanie miało odwrotną składnię.


Warto wspomnieć, że nie musisz podawać długości - zarówno rzutowanie, jak i konwersja pozwolą na coś w stylu select CAST (id as CHAR) jako col1 z t9;
— Jonathan Sayce

1
@JonathanSayce To zła praktyka, aby nie używać długości, sugeruję przeczytanie Złe nawyki do kopania : deklarowanie VARCHAR bez (długość) przez Aarona Bertranda
— Taryn

Ciekawy post - dzięki @bluefeet - założyłem, że w scenariuszu obsady / konwersji użyłby potrzebnego rozmiaru, a nie czegoś arbitralnego.
— Jonathan Sayce

@JonathanSayce Nie jestem zbyt zaznajomiony z tajnikami MySQL i może nie używać czegoś arbitralnego, ale nie polegałbym na silniku MySQL, który jest tak inteligentny (bez obrazy dla MySQL). Aby mieć pewność, że otrzymasz odpowiednią długość, zawsze wyraźnie ją podam.
— Taryn

2
@Pacerier IMO, używanie concat()do konwersji niekoniecznie jest tak intuicyjne. Wolałbym, żeby mój kod był jasny, a to po prostu nie ma sensu.
— Taryn

35

Otrzymujesz to, ponieważ VARCHARnie jest to prawidłowy typ do rzutowania. Zgodnie z dokumentacją MySQL ( http://dev.mysql.com/doc/refman/5.5/en/cast-functions.html#function_cast ) możesz przesyłać tylko do:

  • BINARY [(N)]
  • CHAR [(N)]
  • DATA
  • DATETIME
  • DECIMAL [(M [, D])]
  • PODPISANO
  • [LICZBA CAŁKOWITA]
  • CZAS
  • UNSIGNED [INTEGER]

Myślę, że najlepszym rozwiązaniem jest użycie CHAR.


nie jestem pewien, ponieważ używam mysql, ale wygląda na to, że SQL zezwala na varchar stackoverflow.com/a/11989599, chociaż twoja odpowiedź jest poprawna dla mysql, dzięki.
— CrandellWS

@Aaron Co jeśli moje pole to char (1), ale chcę je przekonwertować na wyliczenie ('m', 'f')?
— dinesh kandpal

17

tak

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

jest postgresql, ale mySql na to nie pozwala!

skrót w mySql:

SELECT concat(id, '') FROM some_table;

1
Hej, SELECT concat (id, '') FROM some_table; to dobry hack dla MySQL, dziękuję!
— Charles Cavalcante

Tak, to wszystko
— George Garchagudashvili

3

Nie mam MySQL, ale są RDBMS (między innymi Postgres), w których można wykorzystać hack

SELECT id || '' FROM some_table;

Concatenate dokonuje niejawnej konwersji.


1
Postgres ma jednak jasne i zwięzłe rzutowanie „:: data_type”. Szkoda by było, gdybyśmy nie skorzystali tutaj z właściwej drogi. Mysql's concat lub +0 są uzasadnione
— AdrianBR

2

Rozwiązałem problem z porównaniem całkowitej varcharkolumny z kolumną xa

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



0

Odpowiem na to ogólnie i bardzo wdzięczny powyższym współpracownikom.
Używam MySQL na MySQL Workbench. Miałem podobny problem, próbując połączyć a chari intrazem przy użyciu GROUP_CONCATmetody. Podsumowując, zadziałało dla mnie to:

powiedzmy, że masz char„c” i int„i”, więc zapytanie wygląda następująco:
...GROUP_CONCAT(CONCAT(c,' ', CAST(i AS CHAR))...


0

Powinien móc również zrobić coś takiego:

Select (id :> VARCHAR(10)) as converted__id_int
from t9 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.