带有null的计算列

时间:2012-11-01 14:50:50

标签: sql sql-server

我正在创建一个视图(使用MS sql 2008),并将计算字段创建为COLUMN1 + COLUMN2。一切都很好,但是:COLUMN1COLUMN2都可以为NULL。

我想遵循以下规则:

  • 2 + 2 = 4
  • 2 + NULL = 2
  • NULL + 2 = 2
  • 0 + 0 = 0
  • NULL + NULL = NULL

如果我使用ISNULL(第2,0列),那么将遵循所有规则,但不会遵循最后一条规则。

我如何创建视图

CREATE VIEW dbo.test
AS
SELECT COLUMN1, COLUMN2, (????????) AS CALCULATEDCOL FROM dbo.TabTest;
GO

9 个答案:

答案 0 :(得分:3)

create view dbo.test AS 
    select
        column1, 
        column2,
        case
            when column1 is null and column2 is null then null
            -- or when isnull(column1, column2) is null then null
            else isnull(column1, 0) + isnull(column2, 0)
        end as CALCULATEDCOL 
    from dbo.TabTest

答案 1 :(得分:3)

CASE  
      WHEN COALESCE(COLUMN1, COLUMN2) IS NULL THEN NULL
      ELSE ISNULL(COLUMN1, 0) + ISNULL(COLUMN2, 0)
END 

答案 2 :(得分:3)

您可以在没有case声明的情况下执行此操作:

select coalesce(column1+column2,
                coalesce(column1, 0) + column2,
                column1 + coalesce(column2, 0)
               )

(函数coalesce等同于isnull,但coalesce是标准SQL,可以使用两个以上的参数。)

使用case语句没有任何缺点。我只是提供这个作为替代方案。

答案 3 :(得分:2)

改为使用CASE表达式。像这样:

CREATE VIEW dbo.test AS 
  SELECT 
    COLUMN1, 
    COLUMN2,
    CASE  
      WHEN COLUMN1 IS NULL AND COLUMN2 IS NULL THEN NULL
      WHEN COLUMN1 IS NULL THEN 0 + COLUMN2
      WHEN COLUMN2 IS NULL THEN 0 + COLUMN1
      ELSE COLUMN1 + COLUMN2
    END AS CALCULATEDCOL 
  FROM dbo.TabTest; 
GO

答案 4 :(得分:1)

它比人们期望的更简单,当有一个名为COALESCE的标准函数时,使用CASE来解决这个问题是一种浪费,只需用你的问号替换你的问号:

COALESCE(col1 + col2, col1, col2)

答案 5 :(得分:0)

您可以使用CASE来处理上一个条件:

CREATE VIEW dbo.test
AS
 SELECT column1,
        column2,
        CASE
            WHEN column1 IS NULL
                THEN column2 + 0
            WHEN column2 IS NULL
                THEN column1 + 0
            WHEN column1 IS NOT NULL AND column2 IS NOT NULL
                THEN column1 + column2
        ELSE NULL
        END AS calculatedcol
  FROM  dbo.tabtest; 

答案 6 :(得分:0)

您的规则似乎是"将空值视为零,除非两个字段都为空,在这种情况下,返回null。"我会用case来解决这个问题,将两条规则分开:

CASE WHEN column1 is null and column2 is null then null
ELSE ISNULL(column1,0) + ISNULL(column2,0)
END

答案 7 :(得分:0)

使用案例系统,当两个值都为NULL时,您可以处理两个值为空时

CREATE VIEW dbo.test
AS
  SELECT COLUMN1, COLUMN2, 
    CASE WHEN (COLUMN1 IS NULL AND COLUMN2 IS NULL) THEN NULL 
    ELSE ISNULL(COLUMN1,0)+ISNULL(COLUMN2,0) 
    END  AS CALCULATEDCOL 
FROM dbo.TabTest;
GO

答案 8 :(得分:0)

您可以使用case关键字来实现此目标。

这些方面的东西

SELECT CASE 
WHEN COLUMN1 IS NULL AND COLUMN2 IS NULL THEN NULL 
WHEN COLUMN1 IS NULL AND... etc...