2

私は次のような選択にエイリアスを持っています:

SELECT
    CASE ....
    WHEN 1 THEN somefield * -10
    WHEN 0 THEN somefield * 10
    END as myAlias
FROM
    ....

問題は、mysql がシークする最初のレコードで、「myAlias」を UNSIGNED としてマークしますが、次のレコードで同じエイリアスが SIGNED 整数を生成し、エラーが発生することです。

BIGINT UNSIGNED value is out of range in....

では、「myAlias」がSIGNED INTEGERであることを操作を行う前にmysqlに伝える方法は?

ありがとう!

編集:

私はもう試した

SELECT
    CAST(CASE ....
    WHEN 1 THEN somefield * -10
    WHEN 0 THEN somefield * 10
    END AS SIGNED) as myAlias
FROM
    ....

成功せずに!

4

2 に答える 2

4

テーブルのフィールドが として宣言されていると仮定しますUNSIGNED INTEGER。その場合、式のTHEN句でフィールドを型キャストする必要がありCASEます。以下の例は、サンプルを示しています。

スクリプトを作成して挿入します。

CREATE TABLE mytable
(
     numberfield INTEGER UNSIGNED
   , bitfield BIT
);

INSERT INTO mytable (numberfield, bitfield) VALUES
  (134, 1),
  (673, 0),
  (855, 1),
  (133, 0),
  (778, 1),
  (234, 0);

THEN 句でフィールドをキャストする型: SQL Fiddle Demo

SELECT
    CASE bitfield
        WHEN 1 THEN CAST(numberfield AS SIGNED) * -10
        WHEN 0 THEN CAST(numberfield AS SIGNED) * 10
    END as myAlias
FROM mytable

出力:

MYALIAS
-------
-1340
6730
-8550
1330
-7780
2340

上記のクエリを記述する別の方法: SQL Fiddle Demo

SELECT
    CAST(numberfield AS SIGNED) * 
    (
        CASE bitfield
            WHEN 1 THEN -10
            WHEN 0 THEN 10
        END
    ) as myAlias
FROM mytable

出力:

MYALIAS
-------
-1340
6730
-8550
1330
-7780
2340

フィールドの型キャストなし: SQL Fiddle Demo

SELECT
    CASE bitfield
      WHEN 1 THEN numberfield * -10
      WHEN 0 THEN numberfield * 10
    END as myAlias
FROM mytable

エラー:

データの切り捨て: BIGINT UNSIGNED 値が '( db_5b3bb. mytable. numberfield* -(10))' の範囲外です: SELECT CASE bitfield WHEN 1 THEN numberfield * -10 WHEN 0 THEN numberfield * 10 END as myAlias FROM mytable

于 2012-05-07T02:10:54.320 に答える
0

「cast()」関数を使用してみてください。

http://dev.mysql.com/doc/refman/5.1/en/cast-functions.html#function_cast

元: select * from mytable where myfield=cast(somefield as UNSIGNED INTEGER)

于 2012-05-07T01:59:56.320 に答える