2011-05-24 226 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') 
相關問題