使用默认值适当地更新 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 列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel 获取列的默认值?

使用原始默认属性值将一个表的一部分插入另一个表

如何在 ORACLE TABLE 上重置列的默认值

Laravel:迁移更改列的默认值(布尔值)

如何在 SQL Server 的单个批次中为列添加默认值并使用默认值更新所有行?

如何使用 MySqlParameter 有条件地将列设置为其默认值?