Закиньте інт на варчар


119

У мене є нижче запит і потрібно перетворити idвvarchar

Схема

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

Що я спробував

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

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

але вони не працюють. Будь ласка, підкажіть.


4
Наступного разу обов’язково включіть фактичне повідомлення про помилку, яке ви бачите. Зазвичай це дуже допомагає з'ясувати, що не так. Цього разу вам пощастило, що багатьом із нас просто трапляється знати, що тут відбувається.
Аарон

Відповіді:


218

Вам потрібно буде castабо convertяк CHARтип даних, не існує varcharтипу даних, на який можна передавати / перетворювати дані:

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

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

Дивіться наступний SQL - в дії - у 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;

Крім того, що ви намагалися перетворити на неправильний тип даних, синтаксис, який ви використовували, convertбув невірним. convertФункція використовує наступне , де exprзнаходиться ваш стовпець або значення:

 CONVERT(expr,type)

або

 CONVERT(expr USING transcoding_name)

Ваш початковий запит мав синтаксис назад.


Можливо, варто згадати, що вам не потрібно вказувати довжину - і керування, і конвертування дозволять щось робити по лінії вибору CAST (id як CHAR) як col1 від t9;
Джонатан Сайс

1
@JonathanSayce Це погана практика , щоб не використовувати довжину, я пропоную читати Шкідливі звички до гри: оголосити VARCHAR без (довжини) по Aaron Bertrand
Taryn

Цікавий пост - спасибі @bluefeet - я вважав, що в сценарії "cast / convert" він би використовував потрібний розмір, а не щось довільне.
Джонатан Сайс

@JonathanSayce Я не надто добре знайомий із новими та виходами MySQL, і він може не використовувати щось довільне, але я б не покладався на те, щоб двигун MySQL був таким розумним (не ображаючи MySQL). Для того щоб бути впевненим, що ви отримаєте належну довжину, я завжди надавав би чітку.
Taryn

2
@Pacerier IMO, використовуючи concat()перетворення, не обов'язково інтуїтивно зрозумілий. Я вважаю за краще, щоб мій код був чітким, і це просто не має сенсу.
Taryn

35

Ви отримуєте це тому VARCHAR, що це неправдивий тип, на який можна подавати. Згідно з документами MySQL ( http://dev.mysql.com/doc/refman/5.5/uk/cast-functions.html#function_cast ), ви можете передавати лише до:

  • Двоєчні [(N)]
  • CHAR [(N)]
  • ДАТА
  • ДАТА, ЧАС
  • ДЕКІМАЛЬНІ [(M [, D])]
  • ПІДПИСАНО
  • [INTEGER]
  • ЧАС
  • НЕЗНАЧЕНО [ІНТЕГЕР]

Я думаю, що найкраще скористатись вами CHAR.


не впевнений, тому що я використовую mysql, але здається, що SQL дозволяє varchar stackoverflow.com/a/11989599, хоча ваша відповідь правильна для mysql, дякую.
CrandellWS

@Aaron Що робити, якщо моє поле char (1), але я хочу перетворити його на enum ('m', 'f') ??
dinesh kandpal


3

У мене немає MySQL, але є RDBMS (Postgres, серед інших), в якому можна використовувати хак

SELECT id || '' FROM some_table;

Конканат робить неявне перетворення.


1
Postgres має чіткий і стислий вміст, але ":: data_type". Прикро було б не використовувати тут належним чином.
Конкрет

2

Я вирішив проблему зі порівнянням цілого стовпця xa varcharзі стовпцем

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



0

Я відповім на це в загальних рисах і дуже вдячний вищевказаним учасникам.
Я використовую MySQL на MySQL Workbench. У мене була подібна проблема, намагаючись об'єднати a charі intразом, використовуючи GROUP_CONCATметод. Підсумовуючи це, що для мене спрацювало так:

скажімо, що ваше charє "c" і intє "i", тож запит стає:
...GROUP_CONCAT(CONCAT(c,' ', CAST(i AS CHAR))...


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.