如何在Snowflake sql中只更新第一个值为空的列?

如何在Snowflake sql中只更新第一个值为空的列?,sql,sql-update,snowflake-cloud-data-platform,sql-view,Sql,Sql Update,Snowflake Cloud Data Platform,Sql View,如何用value更新表的第一个空列,用文本“Available”更新其他空列 我的尝试:我尝试使用Case语句,但这会影响查询的性能 Update Emp SET Level1 = (CASE WHEN Level1 IS NOT NULL THEN Level1 ELSE PermissionCode END), Level2 = (CASE WHEN Level1 IS NOT NULL AND Level2 IS NULL THEN PermissionCode ELSE Lev

如何用value更新表的第一个空列,用文本“Available”更新其他空列

我的尝试:我尝试使用Case语句,但这会影响查询的性能

Update Emp
SET Level1 = (CASE WHEN Level1 IS NOT NULL THEN Level1 ELSE PermissionCode END), 
    Level2 = (CASE WHEN Level1 IS NOT NULL AND Level2 IS NULL THEN PermissionCode ELSE Level2  END),
  ..and so on
是否有任何有效的方法将下面提到的表格更新为预期格式

Current Table structure:
========================
| EmpID  | Level1 | Level2 | Level3 | Level4  |....| Level256 | PermissionCode  |
|--------|--------|--------|--------|---------|....|----------|-----------------|        
| 124RY7 | abc    | wsg    | NULL   | NULL    |....|    NULL  |    RT12345      |
| 5T7YTR | efg    | NULL   | NULL   | NULL    |....|    NULL  |    654GTY       |
 
预期产出:

| EmpID  | Level1 | Level2 | Level3  | Level4  |....| Level256 | PermissionCode  |
|--------|--------|--------|---------|---------|....|----------|-----------------|        
| 124RY7 | abc    | wsg    |RT12345  |Available|....|Available |    RT12345      |
| 5T7YTR | efg    | 654GTY |Available|Available|....|Available |    654GTY       |

  

尝试结合使用nvl2和coalesce

select empid, lvl1, lvl2, lvl3, lvl4, PC
from temp
union all
select empid, coalesce(lvl1,lvl2,lvl3,lvl4,PC), nvl2(lvl1, coalesce(lvl2,lvl3,lvl4,PC), 'Available'), nvl2(lvl2, coalesce(lvl3,lvl4,PC), 'Available'), nvl2(lvl3, coalesce(lvl4,PC), 'Available')
   , PC
from temp;

尝试结合使用nvl2和coalesce

select empid, lvl1, lvl2, lvl3, lvl4, PC
from temp
union all
select empid, coalesce(lvl1,lvl2,lvl3,lvl4,PC), nvl2(lvl1, coalesce(lvl2,lvl3,lvl4,PC), 'Available'), nvl2(lvl2, coalesce(lvl3,lvl4,PC), 'Available'), nvl2(lvl3, coalesce(lvl4,PC), 'Available')
   , PC
from temp;


问题是实际用例是什么。您可以尝试对所有列的每个级别进行批量更新(只需关闭自动提交并手动提交),如“设置levelX=Available where levelX-1为null”,这最终将使您的每一行中只有1个null,然后可以用代码填充。

问题是实际用例是什么。您可以尝试对所有列的每个级别进行批量更新(只需关闭自动提交并手动提交),如“设置levelX=Available where levelX-1为null”,这样最终将使您的每行中只有1个null,您可以用代码填充这些空值。

您使用的是SQL Server吗?还是雪花SQL?我认为您可能需要删除SQL Server标记。如果您修复了数据模型,使不同的“级别”列存储在行中而不是列中,这会更简单。我最初考虑执行
UNPIVOT
,但空值似乎会带来问题。您使用的是SQL Server吗?还是雪花SQL?我认为您可能需要删除SQL Server标记。如果您修复了数据模型,使其具有不同的“级别”,这将更简单列存储在行中,而不是列中。我最初考虑执行
UNPIVOT
,但空值似乎存在问题。它适用于第一个空列,其余列应填充为“可用”是的,现在重新读取它,在我第一次读取它时就忽略了它。更新后,这对我适用。您可能可以在excel中快速生成SQL。它适用于第一个空列,其余列应填充为“可用”是的,现在重新阅读,在我第一次阅读它时就错过了。更新后,这对我有效。您可能可以在excel中快速生成SQL。如何设置列的级别?如果您想自动化查询,可以尝试编写一个存储过程来生成查询,而查询看起来确实像levelX,levelX+1等等如何设置列的级别?如果您想自动化查询,您可以尝试编写一个存储过程来构建查询,它们看起来确实像levelX、levelX+1等等