确定是否有任何值为null,如果为true则为false,否则为true

时间:2011-05-24 20:04:13

标签: sql-server tsql sql-server-2008

我目前有一个select语句,它会检查多个列以查看它们是否有数据。如果它们中的任何一个为null,那么我想要一个设置为false。如果它们都不为null,那么我想要一个设置为true。这就是我现在所拥有的:

select
cast(
        case when ChangeOrderNumber is null then 0 else 1 end *
        case when ClientName is null then 0 else 1 end *
        case when QuoteNumber  is null then 0 else 1 end *
        case when ClientNumber is null then 0 else 1 end *
        case when ServiceLine is null then 0 else 1 end *
        case when ServiceLineCode is null then 0 else 1 end *
        case when GroupLeader is null then 0 else 1 end *
        case when CreatedBy is null then 0 else 1 end *
        case when PTWCompletionDate is null then 0 else 1 end *
        case when BudgetedHours is null then 0 else 1 end *
        case when BudgetDollars is null then 0 else 1 end *
        case when InternalDeadlineDate is null then 0 else 1 end *
        case when ProjectDescription is null then 0 else 1 end *
        case when Sales is null then 0 else 1 end *
        case when Coop is null then 0 else 1 end *
        case when PassThrough is null then 0 else 1 end *
        case when POStatus is null then 0 else 1 end *
        case when PONumber is null then 0 else 1 end as bit
    ) 
    as Flag
from t

现在,该代码有效,但它有点冗长,我想知道是否有人知道更好的方法来做到这一点。请注意,有几种数据类型正在检查中。

进一步详情: 此代码位于应用程序中用于处理变更单的视图中。在处理变更单之前,它必须满足一些数据质量检查。此视图显示是否有任何所需数据为空。

8 个答案:

答案 0 :(得分:11)

只需添加它们,因为NULL +“something”始终为NULL ...

CREATE TABLE #test(column1 int,column2 varchar(4),column3 float)

INSERT #test VALUES(2,'2',2)
INSERT #test VALUES(0,'1',0)
INSERT #test VALUES(null,'1',0)
INSERT #test VALUES(1,null,0)
INSERT #test VALUES(0,'1',null)
INSERT #test VALUES(null,null,null)

SELECT CASE 
WHEN column1 + column2 + column3 is NULL THEN 0 ELSE 1 END, *
FROM #test

来自我在3年前创建的post ......

请注意,如果您的字符不是必须转换为varchar的数字...

INSERT #test VALUES(0,'abc',null)

这是转换,无需转换varchar列

SELECT CASE WHEN CONVERT(VARCHAR(100),column1) 
            + column2 
            +CONVERT(VARCHAR(100),column3)  is NULL THEN 0 ELSE 1 END,*
 FROM #test

答案 1 :(得分:5)

我想我可能会选择这个解决方案,除非有人想出一个更好的解决方案,受到@Alireza的启发:

cast(
        case when (ChangeOrderNumber is null  or
        a.ClientName is null  or
        a.QuoteNumber  is null  or
        ClientNumber is null  or
        ServiceLine is null  or
        ServiceLineCode is null  or
        GroupLeader is null  or
        CreatedBy is null  or
        PTWCompletionDate is null  or
        BudgetedHours is null  or
        BudgetDollars is null  or
        InternalDeadlineDate is null  or
        ProjectDescription is null  or
        Sales is null  or
        Coop is null  or
        PassThrough is null  or
        POStatus is null  or
        PONumber is null) then 'false' else 'true'
        end as bit) as Flag

答案 2 :(得分:3)

请使用IIF()(需要是sql server 2012或更高版本)我真的建议:

IIF(column1 is null, '0', '1')

答案 3 :(得分:2)

这个怎么样?

select not(a is null or b is null or ...)

答案 4 :(得分:2)

你可以反转逻辑。

SELECT
    CASE WHEN ChangeOrderNumber IS NOT NULL
            AND ClientName IS NOT NULL
            AND QuoteNumber IS NOT NULL
            ....
        THEN 1
        ELSE 0
    END [Flag]
FROM t

答案 5 :(得分:1)

创建一个HasValue函数,该函数接收sql_variant并返回一个位。然后在SELECT子句中使用按位AND。

CREATE FUNCTION dbo.HasValue(@value sql_variant) RETURNS bit
AS
BEGIN
    RETURN (SELECT COUNT(@value))
END

GO

SELECT dbo.HasValue(ChangeOrderNumber)
    & dbo.HasValue(ClientName)
    & dbo.HasValue(QuoteNumber)
    ...
    as [Flag]
FROM t

答案 6 :(得分:0)

或者这个:

 declare @test1 char(1)
 declare @test2 char(1)
 declare @outbit bit

 set @test1 = NULL
 set @test2 = 'some value'
 set @outbit = 'True'


 select @test1
 select @test2

 If @test1 + @test2 IS NULL set @outbit = 'False'
 Select @outbit

答案 7 :(得分:0)

更简单 - 只需使用COALESCE函数,该函数返回第一个非空列中的值。

SELECT Flag = CASE 
    WHEN COALESCE (column1, column2, column3, ...) IS NULL THEN 0
    ELSE 1
   END
FROM MyTable