SQL Server 将 NULL 替换为列的长度

Posted

技术标签:

【中文标题】SQL Server 将 NULL 替换为列的长度【英文标题】:SQL Server replace NULLs with the length of the column 【发布时间】:2019-10-31 09:42:18 【问题描述】:

有一张桌子

foo   bar   id
foo1  bar1  NULL
foo2  bar2  NULL
foo2  bar2  NULL
foo3  bar3  NULL
foo4  bar4  NULL
foo4  bar4  NULL

我需要将 NULL 值替换为列的长度,例如 1、2、3 等

foo   bar   id
foo1  bar1  1
foo2  bar2  2
foo2  bar2  3
foo3  bar3  4
foo4  bar4  5
foo4  bar4  6

我已经谷歌了,但不知道如何制作它

【问题讨论】:

列的长度怎么称呼? lenght of the column 是什么意思? 您的意思是要在 id 列中添加某种行号? 列的“长度”是什么意思? id 看起来像数字数据类型,所以它没有“长度”(字符串类型用长度声明)。这看起来更像是您想为 row 编号,即 ROW_NUMBER() 如果后来有人删除了 foo3 行会发生什么? 【参考方案1】:

正如 jarlh 所评论的,您似乎正在尝试将增量数字分配给列 id,按 foo 排序,然后是 bar

select 
    foo,
    bar,
    case when id is null then row_number() over(order by foo, bar) else id end id
from mytable

如果您正在寻找更新:

with cte as (
    select 
        foo,
        bar,
        id,
        row_number() over(order by foo, bar) rn
    from mytable
)
update cte set id = rn
where id is null

【讨论】:

以上是关于SQL Server 将 NULL 替换为列的长度的主要内容,如果未能解决你的问题,请参考以下文章

将特定行转换为列的 SQL 查询

sql数据库中为列添加identity属性有啥用?

如何将sql server 数据库表中的某一列的某一字符替换成需要的字符

SQL Server用最后一个值替换NULL [重复]

使用 Oracle SQL 将可变长度分隔字符串拆分为列

使用 SQL Server 将 XML 解析为列