我正在创建一个视图(使用MS sql 2008),并将计算字段创建为COLUMN1 + COLUMN2
。一切都很好,但是:COLUMN1
和COLUMN2
都可以为NULL。
我想遵循以下规则:
如果我使用ISNULL(第2,0列),那么将遵循所有规则,但不会遵循最后一条规则。
我如何创建视图
CREATE VIEW dbo.test
AS
SELECT COLUMN1, COLUMN2, (????????) AS CALCULATEDCOL FROM dbo.TabTest;
GO
答案 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...