【プロパティの不一致】MySQLのCASE式の罠【データ型】

MySQL

本日は同じテーブルに対して2回SQLを実行し、その後ローカルのデータテーブルでマージを行った所、
なぜかデータ型の不一致と怒られた話し。

実行環境
  • DBMS:MySQL
  • 開発言語:C#
  • IDE:visual studio express 2013 for windows desktop
スポンサーリンク

問題のSQL


単純にカラムYが1の場合( code1 )と0の場合( code2 )それぞれの、IDとZカラムの内容に応じた数値MERGEの情報を欲っするSQL。
Zカラムはtinyint

code1:SQL
SELECT
  ID
, CASE WHEN Z = 1 THEN 1 ELSE 0 END AS MERGE
FROM X
WHERE Y = 1
code2:SQL
SELECT
  ID
, 0 AS MERGE
FROM X
WHERE Y = 0

で、それぞれ取得した情報をデータテーブル(Dt1とDt2)に持ち、第三のデータテーブル(Dt3)にマージを行う。

code3:C#
Dt3 = Dt1.Copy();
Dt3.Merge(Dt2.Copy());

するとDt3.Merge(Dt2.Copy())にて、、、

原因は?


警告を見た感じ「.MERGE と .MERGE は競合するプロパティがあります : DataType プロパティの不一致」との事。
同じテーブルのマージなんだからUNION ALLみたいなもんなのに…??

まぁ言っててもしょうがないので原因を探る事に。
※ちなみにNullは許容してません。

とりあえず DataType プロパティの不一致とあるので、取得後のMERGEカラムのデータ型を見てみる。

string SQL1 = Dt1.Columns["MERGE"].DataType.ToString();
string SQL2 = Dt2.Columns["MERGE"].DataType.ToString();

すると、なんとデータ型がSystem.Int64だったり32だったり、
SQLを実行する度まちまちな模様。

ちなみにSQL2をCASE WHEN Z = 1 THEN 0 ELSE 0 END AS MERGE とかやってみても合いませんでした。これは頂けない!
CASTするにしてもCONVARTするにしても32か64かの指定は出来ないし、
データテーブルにデータをねじ込んだ後にデータタイプの変更も出来ず。。。

原因不明の罠にハマりもがき続ける事数十分、結局’0’として無理やりstring型で返させて逃げました。

まとめ


普通に使う分にはとても便利なので結構な頻度で出現するCASE式ですが、
THEN で返す値を数値にする場合は32でも64でもどちらでも良い場合だけにしときましょう(ᵔᴥᵔ)

コメント