在SQL Server中向现有表格有条件地添加一个默认值列

4

我希望在现有的 SQL 表中添加一个新列,该列的默认值取决于某些情况/条件。

我想知道这是否可能。如果可以,如何实现?如果不行,为什么?

替代方案:

一种选择是创建列,然后进行更新,但这种方法在这里行不通。

让我们考虑以下表:

╔════╦══════════════╗
║ ID ║      Age     ║ 
╠════╬══════════════║
║  10.166667  ║   
║  20.125    ║   
║  313     ║   
║  419     ║  
║  545     ║  
║  659     ║   
║  760     ║  
║  864     ║ 
╚════╩══════════════╝

期望的输出是这样的:

╔════╦══════════════╦═══════════╗
║ ID ║      Age     ║ AgeGroup  ║
╠════╬══════════════╬═══════════╣
║  10.166667  ║   NewBorn ║
║  20.125    ║   NewBorn ║
║  313     ║   Teen    ║
║  419     ║   Teen    ║
║  545     ║   Adult   ║
║  659     ║   Adult   ║
║  760     ║  Elder    ║
║  864     ║  Elder    ║
╚════╩══════════════╩═══════════╝

我研究了这篇帖子,但仅适用于"添加列默认值"

编辑:这里是包含上述表的模式和数据的SQL脚本,供想要测试的用户使用。


我不明白你在这里尝试做什么。你想在表格上添加一个新列吗?新列依赖于什么条件?通常情况下,您会将条件放在“IF”控制流语句中。 - EzLo
“默认值”究竟是什么意思?例如,是否可以在不更改年龄的情况下将值从“teen”更新为“adult”? - Salman A
@SalmanA 是的,我想要改变它。基本上,在每一行中根据条件添加一个具有不同值的列。我想在添加列的同时完成它,而不想编写一个执行此操作的更新查询。 - Sheraz Ahmed
2
下面有一个答案建议使用计算列。但更好的解决方案是不要使用计算列(在您的示例中它们只会添加噪音),而是在报告/用户界面中使用CASE语句将年龄值转换为标签。更好的方法是存储出生日期,这样您就不必每年递增年龄。 - Salman A
@SalmanA 这只是一个样本数据。 - Sheraz Ahmed
只是澄清一下问题。如果ID 3的年龄更改为45岁,AgeGroup是否应该相应更改?如果是这样,那么你所说的不是__默认值__,而是__计算列__。你绝对不应该有两个依赖列,但拥有一个虚拟计算列是可以的。 - Manngo
4个回答

9

您可以尝试这个方法。基本上有两种方法来实现这个目标。

在表结构中添加列

据我所知,你想在你分享的链接中添加表结构中的一列。您可以使用 case 语句添加计算值的列。

编辑:更正语法错误

alter table yourtable
    add AgeGroup as (case 
                        when Age < 2 then 'New Born'
                        when Age < 19 then 'Teen'
                        when Age < 45 then 'Young'
                        when Age > 60 then 'Adult'
                        else 'Invalid' 
                     end);

或者

创建视图

您可以创建一个视图并在需要的地方使用它。

Create View TableResult 
As
Select Id, Age, case Age 
                         WHEN Age < 2 then 'New Born'
                         WHEN Age < 19 then 'Teen'
                         WHEN Age < 45 then 'Young'
                         WHEN Age > 60 then 'Adult'
                         else 'Invalid' 
                     end as AgeGroup
End



在表模式中添加列是我想要的方法,但它会抛出语法错误。 - Sheraz Ahmed
你的回答中有语法错误,我已经纠正了“在表模式中添加列”。谢谢,它现在可以工作了。 - Sheraz Ahmed
我们能否运行一个SQL查询来决定填充哪个值? - Naveen Gopalakrishna

4

使用案例语句

        select case when age>0 and age<13 then 'new born'
        when age>=13 and age<=19 then 'teen'
        .................
           ... end -- put here more condition as your need

请再次阅读问题,谢谢。 - Sheraz Ahmed
@SherazAhmed 在创建表时使用 use case。 - Zaynul Abadin Tuhin

4
您可以使用计算字段。
您的表设计将如下所示:
 CREATE TABLE [dbo].[MyTbl](    
 [ID] [INT] IDENTITY(1,1) NOT NULL, 
 [Age] DECIMAL(10,3) NOT NULL,  
 [AgeGroup]  AS (CASE WHEN Age < 1 THEN 'Newborn' 
                      WHEN Age BETWEEN 1 AND 13 THEN 'Kid' 
                      WHEN Age BETWEEN 13 AND 60 THEN 'Adult' 
                      WHEN Age > 60 THEN 'Elder' END)  
 CONSTRAINT [PK_ID]
 PRIMARY KEY CLUSTERED  (   [ID] ASC ))

您的领域将被自动填充,您只需添加您的年龄。


正如我在问题中提到的,“我想在现有的SQL表中添加一个新列”。 - Sheraz Ahmed
这并没有解决实际问题,但是非常感谢。这增加了我对SQL中计算列的知识。https://learn.microsoft.com/en-us/sql/relational-databases/tables/specify-computed-columns-in-a-table?view=sql-server-2017 - Sheraz Ahmed

1
首先,您需要在表格中创建AgeGroup列:
ALTER TABLE yourTable
ADD AgeGroup VARCHAR(10)

关于根据设置条件进行默认值设置:
UPDATE yourTable
SET AgeGroup = CASE WHEN yourTable.Age >= 0 AND yourTable.Age < 2 THEN 'NewBorn'
WHEN yourTable.Age >= 13 AND yourTable.Age <= 19 THEN 'Teen'
WHEN yourTable.Age >= 20 AND yourTable.Age <= 59 THEN 'Adult'
WHEN yourTable.Age >= 60 THEN 'Elder' END

请在问题中阅读:“一种选项是创建列,然后更新,但这种方法在此无法使用。” - Sheraz Ahmed
像这样的SQL脚本是生成默认值的最接近方法。您不能简单地通过SQL Server用户界面将数字添加到“AgeGroup”列中,并期望能够配置SQL Server以根据年龄对年龄组进行分类。如果可以的话,很难找到相关文档。我建议使用SQL脚本在预设条件下生成默认值。 - Max Voisard

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