【问题标题】:Updating TABLE columns appropriately with default values使用默认值适当地更新 TABLE 列
【发布时间】: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=''
)

感谢期待

【问题讨论】:

    标签: sql-server default


    【解决方案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 子句。它更新每个字段上的每个值,但在已经存在信息的地方,它会使用该信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 2020-02-11
      • 1970-01-01
      • 2014-11-06
      相关资源
      最近更新 更多