【问题标题】:Computed column based on nullable columns基于可为空列的计算列
【发布时间】:2011-07-06 02:17:45
【问题描述】:

我想创建一个计算列,它是几个其他列的连接。在下面的示例中,当任何“真实”列为空时,结果集中的 fulladdress 为空。如何调整计算列函数以考虑可空列?

CREATE TABLE Locations
(
    [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [fulladdress]  AS (((([address]+[address2])+[city])+[state])+[zip]),
    [address] [varchar](50) NULL,
    [address2] [varchar](50) NULL,
    [city] [varchar](50) NULL,
    [state] [varchar](50) NULL,
    [zip] [varchar](50) NULL
)

提前致谢

【问题讨论】:

    标签: sql sql-server calculated-columns


    【解决方案1】:

    这很快就会变得一团糟,但这是一个开始:

    ISNULL(address,'')      + ' ' 
      + ISNULL(address2,'') + ' '
      + ISNULL(city,'')     + ' ' 
      + ISNULL(state,'')    + ' '
      + ISNULL(zip,'')
    

    (如果isnull 不起作用,您可以尝试coalesce。如果两者都不起作用,请分享您正在使用的 DMBS。)

    【讨论】:

    • Thx,如果我想用逗号分隔字段(如果列有值,请在其后面加上逗号和空格)我会怎么做?
    • 怎么样:select coalesce(address, '') + coalesce(', ' + address2, '') + coalesce(', ' + city, '') + coalesce(', ' + state, '') + coalesce(', ' + zip, '') 来自位置
    【解决方案2】:

    除非您有充分的理由,否则您不应将完整的地址列(与其他列重复)存储在数据库中。正确的方法是在查询中构造完整的地址字符串。通过动态创建字段,您可以减少表中的冗余,并减少一列需要维护(需要在任何其他列更改时进行更新)。

    在您的查询中,您会执行类似的操作

    SELECT CONCAT(ISNULL(address,''), ISNULL(address2,''), ISNULL(city,''), ISNULL(state,''), ISNULL(zip,'')) AS fulladdress FROM Locations; 
    

    CONCAT() 函数执行连接,ISNULL() 如果字符串不为空,则为您提供字符串,如果为空,则为您提供第二个参数(作为 '' 传递)

    【讨论】:

    • 谢谢。我不会将完整地址保存到数据库中(因为它是表定义中的计算列),所以没有理由更新它。
    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 2021-07-15
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多