我有这张桌子
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)
我该如何解决这个问题?
答案 0 :(得分:1)
您的问题并不清楚为什么您认为应该更新这些行,而是要检查您必须使用的NULL
值IS 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);