使用默认值填充非空列之间的空列

3

我想要填充指定列之间的所有NULL列。

我的表:

Table

如果较高级别中有值,则我希望填充每个NULL列。

例如:

  • ID为1的行的Level3应该有一个默认值(“def”)
  • ID为2的行是正确的。最后填充的列是level4,之后没有列有值。
  • ID为3的行的Level5、Level6、Level7、Level8、Level9应该有一个默认值(“def”)
  • ID为4的行的Level4、Level5、Level6、Level8、Level9应该有一个默认值(“def”)

SQL Fiddle


1
如果Level1Level2Level5Level7中都有值,那么Level6是否也应该更新为默认值? - Felix Pamittan
no only NULL Columns. - WhoisIt
1
但在我的例子中,“Level6”没有值。 - Felix Pamittan
1
抱歉,是我的错误。是的,每一列都有NULL并且具有较高值的列。我已经编辑了我的帖子;-) - WhoisIt
1
基于@cha的回答,可以查看以下链接:http://sqlfiddle.com/#!3/032ba/2/0 - Felix Pamittan
1个回答

3
这是我能想到的最好的翻译:

这是我能想到的最好的方案:

update #Levels
set 
level1 = CASE WHEN COALESCE(level2, level3, level4, level5, level6, level7, level8, level9, level10) IS NULL THEN level1 ELSE ISNULL(level1, 'def') END,
level2 = CASE WHEN COALESCE(level3, level4, level5, level6, level7, level8, level9, level10) IS NULL THEN level2 ELSE ISNULL(level2, 'def') END,
level3 = CASE WHEN COALESCE(level4, level5, level6, level7, level8, level9, level10) IS NULL THEN level3 ELSE ISNULL(level3, 'def') END,
level4 = CASE WHEN COALESCE(level5, level6, level7, level8, level9, level10) IS NULL THEN level4 ELSE ISNULL(level4, 'def') END,
level5 = CASE WHEN COALESCE(level6, level7, level8, level9, level10) IS NULL THEN level5 ELSE ISNULL(level5, 'def') END,
level6 = CASE WHEN COALESCE(level7, level8, level9, level10) IS NULL THEN level6 ELSE ISNULL(level6, 'def') END,
level7 = CASE WHEN COALESCE(level8, level9, level10) IS NULL THEN level7 ELSE ISNULL(level7, 'def') END,
level8 = CASE WHEN COALESCE(level9, level10) IS NULL THEN level8 ELSE ISNULL(level8, 'def') END,
level9 = CASE WHEN COALESCE(level10, null) IS NULL THEN level9 ELSE ISNULL(level9, 'def') END

虽然看起来有点乱,但却实现了功能

SQL Fiddle


2
ELSE 部分替换为 ISNULL(<column>, 'def'),然后就可以运行了! - Felix Pamittan
1
谢谢@FelixPamittan。那是缺失的链接。 - cha
1
你也可以添加 WHERE Level1 IS NULL OR Level2 IS NULL ..。至少它不必更新带有 WHERE 子句的所有行。 - Felix Pamittan
谢谢 :-) 我的第一次尝试都太复杂了.. :-) - WhoisIt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接