2011-05-24 228 views
8

我目前有一个select语句,用于检查几列以查看它们是否有数据。如果它们中的任何一个都是空的,那么我需要一些设置为false。如果他们都不是null,那么我想要一点设置为true。这是我目前有:确定是否有值为空,如果为true,则返回false,否则为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 

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

更多详细信息: 此代码位于处理更改订单的应用程序中正在查看的视图中。在可以处理变更单之前,它必须符合一些数据质量检查。此视图显示是否有任何所需的数据为空。

+0

来吧大卫......你不知道如何做到这一点:P – SQLMenace 2011-05-24 20:19:59

回答

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

这个呢?

select not(a is null or b is null or ...) 
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 
+0

你”只重新测试相同的数据类型,我的数据类型有多种。如果char有任何非数字字符,则向char添加int将失败 – DForck42 2011-05-24 20:47:23

11

只需把它们加起来因为NULL + “东西” 始终是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 

post我创造了超过3年前。 ..

请记住,如果您的字符不是必须转换为的数字...

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 
+0

与添加类似,也可以使用按位运算符(&)'SELECT CASE WHEN(4&5&null)> 0 THEN 1 ELSE 0 END' – EBarr 2011-05-24 20:30:06

+0

,正如我在最后一行中指出的那样....'请记住,如果您的字符不是数字,您必须将其转换为varchar' – SQLMenace 2011-05-24 20:45:06

+0

@SQLMenace,但这是事实,varchars DO具有非数字字符,所以它在转换时失败 – DForck42 2011-05-24 20:46:14

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 
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 
+0

有趣的是,我得看看性能是怎样的 – DForck42 2011-05-24 21:14:27

0

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

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

请使用IIF()(必须的SQL Server 2012或更高版本),我真的建议:

IIF(column1 is null, '0', '1') 
相关问题