2

varchar(50) フィールドを整数に置き換える、クリーンアップされたテーブルを作成しようとしています。元のフィールドには、0 または null 値に変換したいテキスト値がときどきあります。これは select ステートメントで問題なく実行できますが、テーブルを作成しようとするとエラーが発生します。

以下は、文字列を使用する最小限の例です。

/* This works */
DROP TABLE IF EXISTS mytest;
CREATE TABLE mytest
AS
   SELECT convert("123", unsigned) AS mynum;

/* This works, returning a row of 0 */
SELECT convert("TEST", unsigned) AS mynum;

/* But this fails, with:  Truncated incorrect INTEGER value: 'TEST'*/
DROP TABLE IF EXISTS mytest;
CREATE TABLE mytest
AS
   SELECT convert("TEST", unsigned) AS mynum;`

上記の何が問題なのですか?私が望むことを達成するためのより良い方法はありますか? 助けてくれてありがとう。

4

4 に答える 4

2

これには case ステートメントを使用し、convert の代わりに CAST を使用するように切り替えて、暗黙的な変換ではなくエラーが発生するようにします。

CREATE TABLE mytest(myVarchar varchar(10));
INSERT mytest VALUES ('123'),('TEST');

SELECT CASE
    WHEN  myVarchar REGEXP '^[0-9]+$' THEN CAST(myVarchar,unsigned)
    ELSE 0
END As mynum
FROM mytest;

これをテストするのに便利な mysql インスタンスを持っていないので、うまくいけば、構文エラーはありませんでした。

于 2012-07-25T16:45:08.870 に答える
2

そのエラーが発生する理由についての説明はありませんが、サブクエリを使用して回避策を見つけました。

DROP TABLE IF EXISTS mytest;
CREATE TABLE mytest
AS
    SELECT mynum
    FROM (SELECT convert("TEST"), unsigned) AS mynum) t;

デモ: http://www.sqlfiddle.com/#!2/4909a/1

于 2012-07-25T16:34:57.797 に答える
0

変換するのではなく、データを更新してからテーブルを変更できます。

UPDATE mytest SET mynum=mynum + 0;
ALTER TABLE mytest CHANGE COLUMN mynum mynum INT UNSIGNED;
于 2012-07-25T16:38:19.113 に答える
0

create の select ステートメントで列名を暗黙的に定義しているようです。これは、「TEST」文字列がデータ型であると想定している可能性があります。表示されるエラー メッセージを確認すると役立ちますが、列を次のように明示的に定義することを前提としています。

CREATE TABLE mytest(mynum int);

それで

Insert into mytest(mynum)
select convert("TEST",unsigned) as mynum;

これが、サブクエリを使用した回答が機能する理由でもあり、外側のクエリに到達するまでに、暗黙的に int として定義されます。

于 2012-07-25T16:46:38.223 に答える