使用默认值适当地更新 TABLE 列
Posted
技术标签:
【中文标题】使用默认值适当地更新 TABLE 列【英文标题】:Updating TABLE columns appropriately with default values 【发布时间】:2011-11-20 12:34:46 【问题描述】:假设我有一个表“xyz”,其中包含 a、b、c、d、e 列,我发现表中的列随机为空。现在我必须扫描表找出列在哪里是空的,并用默认值更新列(例如 a 和 'a',b 和 'b',c 和 'c' ...),同时保留其他列在未更改的行中。怎么可能?
我已经创建了以下程序,但它对我来说并不是一个好兆头:
create procedure SP_DEFAULTS as
update xyz set a= 'a',
b= 'b',
c= 'c'
d= 'd',
e= 'e'
where (a=''
or b=''
or c=''
or d=''
or e=''
)
感谢期待
【问题讨论】:
【参考方案1】:不要运行您的 SQL。你会更新错误的东西。
update xyz
set
a=CASE
WHEN LTRIM(ISNULL(a,''))='' THEN 'a'
ELSE a
END,
b=CASE
WHEN LTRIM(ISNULL(b,''))='' THEN 'b'
ELSE b
END,
c=CASE
WHEN LTRIM(ISNULL(c,''))='' THEN 'c'
ELSE c
END,
d=CASE
WHEN LTRIM(ISNULL(d,''))='' THEN 'a'
ELSE d
END,
e=CASE
WHEN LTRIM(ISNULL(e,''))='' THEN 'a'
ELSE e
END
WHERE
(
LTRIM(ISNULL(a,''))=''
OR LTRIM(ISNULL(b,''))=''
OR LTRIM(ISNULL(c,''))=''
OR LTRIM(ISNULL(d,''))=''
OR LTRIM(ISNULL(e,''))=''
)
【讨论】:
这是个好主意。为什么我没有想到:P?一定是早上太早了。 同意这个想法,但我认为你不需要LTRIM
。此外,SET 子句中的表达式可以更简单:a = ISNULL(NULLIF(a, ''), 'a')
。
我添加修剪的想法是,这将涵盖空值、空字符串和由空格组成的字符串。【参考方案2】:
当前,当其中一个字段为空时,您将更新整行。您将不得不做更多类似的事情,以便您只能在该字段为空时更新该字段。此外,在您完成 SP 后,您应该为每个字段在表格上设置默认值,这样就不会再发生这种情况了。
UPDATE xyz
SET a = 'a'
WHERE a = ''
UPDATE xyz
SET b = 'b'
WHERE b = ''
UPDATE xyz
SET c = 'c'
WHERE c = ''
UPDATE xyz
SET d = 'd'
WHERE d = ''
UPDATE xyz
SET e = 'e'
WHERE e = ''
【讨论】:
@user653622 :这是最简单的方法,但是如果您需要动态的字段,那将比这复杂得多;我们将使用动态 SQL,我们可能必须访问系统表..【参考方案3】:update xyz set
a=coalesce(a,'a'),
b=coalesce(b,'b'),
c=coalesce(c,'c'),
d=coalesce(d,'d')
Coalesce 返回一系列值/变量中的第一个非空值。因此,如果字段 a 为空,则返回字符串 'a'
我会使用 pk 在其上放置一个 where 子句,并评估如果这符合您的要求,然后删除 where 子句。它更新每个字段上的每个值,但在已经存在信息的地方,它会使用该信息。
【讨论】:
以上是关于使用默认值适当地更新 TABLE 列的主要内容,如果未能解决你的问题,请参考以下文章