2

これは 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 として解釈することさえできました。

そして、なぜそれは時々うまくいき、他の人ではうまくいかなかったのですか? <-- この部分は最悪です。

4

1 に答える 1

2

これ:

IF(a.testcol IS NULL,'',a.testcol)

null になることはなく、条件は次のとおりです。

WHERE IF(a.testcol IS NULL,'',a.testcol) IS NOT NULL

常にすべての行を返します。


testcol が null の場合、空の文字列を割り当てます。''

空の文字列は とは異なり NULL、これはバグではありません

次のようなものを使用する必要があります。

SELECT testcol FROM
(
    SELECT '1' AS testcol
    UNION
    SELECT null
) a

WHERE IF(a.testcol IS NULL, NULL ,a.testcol) IS NOT NULL

また:

SELECT testcol FROM
(
    SELECT '1' AS testcol
    UNION
    SELECT null
) a

WHERE ISNULL(a.testcol) = true 

ISNULL引数が null の場合、単に「true」を返します。

于 2013-02-19T22:46:29.563 に答える