1

実行中の MySQL クエリから結果が得られない理由を理解しようとしています。

クエリで値を数値に置き換えようとしてNULLいますが、何が間違っているのかわかりません。

これが私のクエリです:

UPDATE Details
SET HowHear_ID = CASE HowHear_ID
  WHEN '' THEN 25   
  WHEN NULL THEN 25                         
  WHEN 7  THEN 25
  WHEN 8  THEN 5
  WHEN 16 THEN 25
  WHEN 17 THEN 16
END
WHERE HowHear_ID IN ('',NULL,7,8,16,17)

このクエリは、NULL値以外のすべてに影響します。

私は何を間違っていますか??

4

3 に答える 3

4

NULLSQL では値が等しい (または「等しくない」) ことはありません。次の真理値表を理解してください。

NULL = NULL yields NULL   -- not FALSE!
NULL != NULL yields NULL  -- not TRUE!
[ANY] = NULL yields NULL  -- not FALSE!
[ANY] != NULL yields NULL -- not TRUE!

以下は同等なので...

[expression] IN (a, b, c)
[expression] = ANY (a, b, c)
[expression] = a OR [expression] = b OR [expression] = c

NULL...の右側に置くことはできませんIN predicateNULL興味深いことに、 a の右側に置くと事態はさらに悪化しますNOT IN predicate

[expression] NOT IN (a, b, c)
[expression] != ANY (a, b, c)
[expression] != a AND [expression] != b AND [expression] != c

bだった場合NULL、式全体はNULL(または多分FALSE) になりますが、決して ではありませんTRUE。これはNOT IN (subselect)述語にも当てはまります。したがって、これは絶対に行わないでください。

[expression] NOT IN (NULL, 1, 2)

あなたの場合の正しい解決策は、NULL predicate代わりに a を使用します。これを行う:

UPDATE Details
SET HowHear_ID = CASE 
  WHEN HowHear_ID = ''    THEN 25   
  WHEN HowHear_ID IS NULL THEN 25  -- Use a NULL predicate here
  WHEN HowHear_ID = 7     THEN 25
  WHEN HowHear_ID = 8     THEN 5
  WHEN HowHear_ID = 16    THEN 25
  WHEN HowHear_ID = 17    THEN 16
END
WHERE HowHear_ID IN ('',7,8,16,17)
   OR HowHear_ID IS NULL           -- Use a NULL predicate here

またはこれ:

WHERE COALESCE(HowHear_ID, '') IN ('',7,8,16,17)
于 2012-08-18T17:35:00.307 に答える
1

句で参照NULLして、期待する結果を得ることはできません。他の値とは異なる動作をします。WHERENULL

参照する必要がある場合は、isnull()関数を使用する必要があります。

あなたの場合、次のように書きます。

WHERE HowHear_ID IN ('',7,8,16,17) or isnull(HowHear_ID)

ところで、フィールドのデータ型を指定していません。私はそれが整数であると仮定します。その場合、空の文字列ではなく、ゼロをチェックする方が良いでしょうか? (整数でない場合は、おそらく整数である必要があります)

于 2012-08-18T17:38:38.443 に答える
1

あなたはそれを達成することができます

WHERE HowHear_ID IN ('',7,8,16,17) OR HowHear_ID IS NULL
于 2012-08-18T17:38:38.630 に答える