intをvarcharにキャストする


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

データ型にする必要があるcastconvert、またはCHARデータ型として、データvarcharをキャスト/変換できるデータ型はありません:

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

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

SQL Fiddleで次のSQLの動作を確認してください。

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

元のクエリの構文は逆でした。


長さを指定する必要がないことに言及する価値があるかもしれません-キャストと変換の両方で、t9からcol1としてselect CAST(id as CHAR)の行に沿って何かを許可します。
ジョナサンセイス2014年

1
@JonathanSayce長さを使用しないことは悪い習慣です。悪い癖を蹴るのを読むことをお勧めしますアーロンバートランド
Taryn

興味深い投稿-@bluefeetに感謝-キャスト/変換のシナリオでは、恣意的なものではなく、必要なサイズを使用したと思います。
ジョナサンセイス2014年

@JonathanSayce私はMySQLの詳細についてはあまり詳しくないので、恣意的なものは使用しないかもしれませんが、MySQLエンジンがそのスマートであることには依存しません(MySQLに害はありません)。適切な長さを確実に得るために、私は常に明示的に長さを提供します。
タリン

2
@Pacerier IMO、concat()変換を行うために使用することは必ずしもそれほど直感的ではありません。私はコードを明確にすることを望みますが、それはまったく意味がありません。
タリン

35

VARCHARはキャストするのに有効な型ではないため、これが発生しています。MySQLのドキュメント(http://dev.mysql.com/doc/refman/5.5/en/cast-functions.html#function_cast)によると、以下にのみキャストできます。

  • BINARY [(N)]
  • CHAR [(N)]
  • 日付
  • 日付時刻
  • 10進数[(M [、D])]
  • 署名済み
  • [整数]
  • 時間
  • 符号なし[整数]

あなたの最善の策はを使うことだと思いますCHAR


私はmysqlを使用しているのでわかりませんが、SQLではvarchar stackoverflow.com/a/11989599が許可されているようですが、あなたの答えはmysqlに対して正しいです。
CrandellWS 2014

@Aaron私のフィールドがchar(1)ですが、それをenum( 'm'、 'f')に変換したい場合はどうなりますか?
dinesh kandpal 2017

17

はい

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

postgresqlですが、mySqlはそれを許可していません!

mySqlのショートカット:

SELECT concat(id, '') FROM some_table;

1
こんにちは、SELECT concat(id、 '')FROM some_table; MySQLの良いハックです、ありがとう!
Charles Cavalcante

ええ、それだけです
ジョージガルチャグダシビリ

3

私はMySQLを持っていませんが、ハックを使用できるRDBMS(とりわけPostgres)があります

SELECT id || '' FROM some_table;

連結は暗黙的な変換を行います。


1
Postgresは、明確で簡潔なキャストを持っていますが、 ":: data_type"です。ここで適切な方法を使用しないのは残念です。Mysqlの連結または+0は正当化される
AdrianBR

2

整数の列xa varchar列と比較する問題を解決しました

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



0

私は一般的な言葉でこれに答えます、そして上記の貢献者にとても感謝します。
MySQL WorkbenchでMySQLを使用しています。メソッドを使用してとを連結しようとすると、同様の問題がcharありました。要約すると、私のためにうまくいったのはこれです: あなたの'c'と'i'であるとしましょう、したがって、クエリは次のようになります:intGROUP_CONCAT

charint
...GROUP_CONCAT(CONCAT(c,' ', CAST(i AS CHAR))...


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.