1

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

我想遵循以下规则:

  • 2 + 2 = 4
  • 2 + 空 = 2
  • 空 + 2 = 2
  • 0 + 0 = 0
  • 空 + 空 = 空

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

我需要如何创建视图

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

9 回答 9

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
于 2012-11-01T14:56:07.747 回答
3
CASE  
      WHEN COALESCE(COLUMN1, COLUMN2) IS NULL THEN NULL
      ELSE ISNULL(COLUMN1, 0) + ISNULL(COLUMN2, 0)
END 
于 2012-11-01T14:57:15.287 回答
3

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

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

(该函数coalesce等价于isnull,除了coalesce是标准 SQL 并且可以接受两个以上的参数。)

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

于 2012-11-01T15:01:32.517 回答
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
于 2012-11-01T14:53:55.547 回答
1

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

COALESCE(col1 + col2, col1, col2)
于 2012-11-01T17:14:29.823 回答
0

您可以使用 aCASE来处理最后一个条件:

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; 
于 2012-11-01T14:53:07.050 回答
0

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

CASE WHEN column1 is null and column2 is null then null
ELSE ISNULL(column1,0) + ISNULL(column2,0)
END
于 2012-11-01T14:56:57.540 回答
0

使用案例系统,您可以处理两个值都为空的情况,因为它们中的任何一个都为空

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
于 2012-11-01T14:57:04.380 回答
0

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

这些线上的东西

SELECT CASE 
WHEN COLUMN1 IS NULL AND COLUMN2 IS NULL THEN NULL 
WHEN COLUMN1 IS NULL AND... etc...
于 2012-11-01T14:58:39.480 回答