これは MySQL のバグですか (5.1.41-community) --
CREATE TEMPORARY TABLE zztest (stuff varchar(20) NULL)
INSERT INTO zztest
SELECT
'test'
FROM (
select '1' as testcol
union
select null
) a
WHERE **IF(a.testcol IS NULL,'',a.testcol)** IS NOT NULL
これは単純化されたクエリです。** の間の IF 式は太字にする必要がありました。これは、IF 式が無邪気にクエリに配置された動的クエリに由来します。
選択自体は機能します。挿入ステートメントと組み合わせると、機能しませんでした。内部選択は、作成された一時テーブルのチェック対象の列に null を含めることができることを示すように設計されています。
この問題は、IF を IFNULL(a.testtool, '') に置き換えることで「修正」されました。
他のいくつかの置換も失敗します (選択自体は機能します)。
1 IF (a.testcol, '', a.testcol)
2 IF (a.testcol, '', '')
3 IF ('', '', '')
このバグは MySQL の他のバージョンにも存在しますか?
編集 -- select を使用したクエリの結果:
メッセージ: エラー コード: 1292。誤った INTEGER 値が切り捨てられました: ''
想定される結果は、2 つの「テスト」文字列が zztest テーブルに入力されることです。
編集 -- 約 2 時間後にもう一度試してみました。最後の 2 つのステートメントは「機能しました」(上記のクエリにプラグインすることを忘れないでください..)。最初の置換ステートメントが失敗しました。その後、2 番と 3 番が再び失敗しました。
したがって、ステートメント 1 が原因のようです (そして、元のステートメントは現在エラーになっています...)。おそらく、同じ中間結果を生成するステートメントも失敗する、ある種の悪い状態が存在します。
フォローアップの質問は、クエリがリセットされたことを確認する方法はありますか?
新しい接続でクエリを実行しようとした直後に、ワークベンチがクラッシュしました.. 関連?
編集 -- 明示的なキャストが機能することがわかりました:
IF (a.testcol, cast('' as char), cast('' as char))
だから私はそれを回避する方法を見つけました。問題は、なぜ '' (引用符で囲まれたもの) が INTEGER として解釈されるのでしょうか? '' を連結することで、DOUBLE として解釈することさえできました。
そして、なぜそれは時々うまくいき、他の人ではうまくいかなかったのですか? <-- この部分は最悪です。