我可以在保持功能的同时组合多个更新语句吗?
Can I combine multiple update statements while keeping functionality?
我正在执行一个存储过程,当我遇到大约 13 个类似于下面的更新语句时,我正在尝试对其进行优化。我想知道是否有人有比这更好的解决方案。我知道我可以使用 case 语句或合并,这在语义上是相同的,但请记住,所有列都将始终更新。这可能不会给您带来任何问题,但我的交易量可能很大,因此这种方法可能会导致并发问题。
UPDATE COGS
SET Revenue = 0
WHERE Revenue IS NULL
AND monthDate = @targetCOGSdate;
UPDATE COGS
SET Costs = 0
WHERE Costs IS NULL
AND monthDate = @targetCOGSdate;
UPDATE COGS
SET Disposal = 0
WHERE Disposal IS NULL
AND monthDate = @targetCOGSdate;
UPDATE COGS
SET Trans = 0
WHERE Trans IS NULL
AND monthDate = @targetCOGSdate;
使用 coalesce
表达式将列设置为 0(如果它们为空):
UPDATE COGS
SET Revenue = coalesce(Revenue, 0),
Costs = coalesce(Costs, 0),
Disposal = coalesce(Disposal, 0),
Trans = coalesce(Trans, 0)
WHERE (Revenue IS NULL or Costs IS NULL or Disposal IS NULL or Trans IS NULL)
AND monthDate = @targetCOGSdate;
但是你为什么要这样做?我会保留 NULL!
是的,使用 COALESCE()
:
UPDATE COGS
SET Revenue = COALESCE(Revenue, 0),
Costs = COALESCE(Costs, 0),
Disposal = COALESCE(Disposal, 0),
Trans = COALESCE(Trans, 0)
WHERE monthDate = @targetCOGSdate AND
(Revenue IS NULL OR Costs IS NULL OR Disposal IS NULL OR Trans IS NULL);
我正在执行一个存储过程,当我遇到大约 13 个类似于下面的更新语句时,我正在尝试对其进行优化。我想知道是否有人有比这更好的解决方案。我知道我可以使用 case 语句或合并,这在语义上是相同的,但请记住,所有列都将始终更新。这可能不会给您带来任何问题,但我的交易量可能很大,因此这种方法可能会导致并发问题。
UPDATE COGS
SET Revenue = 0
WHERE Revenue IS NULL
AND monthDate = @targetCOGSdate;
UPDATE COGS
SET Costs = 0
WHERE Costs IS NULL
AND monthDate = @targetCOGSdate;
UPDATE COGS
SET Disposal = 0
WHERE Disposal IS NULL
AND monthDate = @targetCOGSdate;
UPDATE COGS
SET Trans = 0
WHERE Trans IS NULL
AND monthDate = @targetCOGSdate;
使用 coalesce
表达式将列设置为 0(如果它们为空):
UPDATE COGS
SET Revenue = coalesce(Revenue, 0),
Costs = coalesce(Costs, 0),
Disposal = coalesce(Disposal, 0),
Trans = coalesce(Trans, 0)
WHERE (Revenue IS NULL or Costs IS NULL or Disposal IS NULL or Trans IS NULL)
AND monthDate = @targetCOGSdate;
但是你为什么要这样做?我会保留 NULL!
是的,使用 COALESCE()
:
UPDATE COGS
SET Revenue = COALESCE(Revenue, 0),
Costs = COALESCE(Costs, 0),
Disposal = COALESCE(Disposal, 0),
Trans = COALESCE(Trans, 0)
WHERE monthDate = @targetCOGSdate AND
(Revenue IS NULL OR Costs IS NULL OR Disposal IS NULL OR Trans IS NULL);