【プロパティの不一致】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
code2:SQL

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

code3:C#

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

原因は?

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

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

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

すると、なんとデータ型が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でもどちらでも良い場合だけにしときましょう(ᵔᴥᵔ)

コメント