在oracle中使用NULL列进行更新

时间:2014-04-25 22:29:49

标签: sql oracle

我有这张桌子

Quantity | Response | Month | Year | Name
__________________________________________
2365      'Response1'  3      2014  (null)
1420      'Response2'  3      2014  'Name1'
2365      'Response1'  3      2014  (null)
 750      (null)       3      2014  'Name2'
  65      (null)       3      2014  (null)

我在存储过程中运行此更新

update Table1 
set Quantity = q, 
    Response = resp, 
    Month = monthv, 
    Year = yearv, 
    Name = namescreen   
where   Month = monthv 
    and Year = yearv 
    and Response = resp 
    and Name = namescreen;

具有空值的列未获得更新

Quantity | Response | Month | Year | Name
__________________________________________
2365      'Response1'  3      2014  (null)
1500      'Response2'  3      2014  'Name1'
2365      'Response1'  3      2014  (null)
 750      (null)       3      2014  'Name2'
  65      (null)       3      2014  (null)

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

您的问题并不清楚为什么您认为应该更新这些行,而是要检查您必须使用的NULLIS NULL。这是因为NULL被解释为'未知'在标准SQL中。这意味着大多数涉及空值的条件检查也会产生“未知”。

考虑这个真值表:

c1   | c2    | c1 AND c2  | c1 OR c2
----------------------------------
null | true  | null      | true
null | null  | null      | null
null | false | false     | null

答案 1 :(得分:0)

update Table1 set Quantity=q, Response=resp, Month=monthv, Year=yearv, Name=namescreen   
where Month = monthv and Year=yearv and Response=resp and Name=namescreen;

你的说法更新表格,所有的RAWS都使用这个

update Table1 set Quantity=q, Response=resp, Month=monthv, Year=yearv, Name=namescreen   
where Quantity=q;

你必须检查在一个值中的使用位置而不是两个

答案 2 :(得分:0)

不确定为什么你在你的WHERE子句中使用的SET语句中使用相同的值 - 但这是一个(潜在的)问题。 (更新月份=月份,月份已经是4月份......你能看到它吗?)通常你要么用钥匙找到记录,要么使用两个变量 - 旧值和新值 - 例如:

SET Year = new_yearv WHERE Year = old_yearv

SET Year = yearv WHERE primary_key_field = 5

另一个问题(可能)是您可能没有像您想象的那样传递存储过程的NULL值。他们可能会在他们通过之前转换为空字符串或类似的东西。无论如何,尝试这样的事情:

WHERE (Year=yearv OR Year IS NULL) AND (Month = monthv OR Month IS NULL), etc.

答案 3 :(得分:0)

我认为您只想在列与输入值匹配时设置数量。此查询应该实现:

update Table1 
    set Quantity = q 
where (Month = monthv or Month is null and monthv is null) and
      (Year = yearv or Year is null and yearv is null) and
      (Response = resp or Response is null and resp is null) and
      (Name = namescreen or Name is NULL or namescreen is null);