我目前有一个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
现在,该代码有效,但它有点冗长,我想知道是否有人知道更好的方法来做到这一点。请注意,有几种数据类型正在检查中。
进一步详情: 此代码位于应用程序中用于处理变更单的视图中。在处理变更单之前,它必须满足一些数据质量检查。此视图显示是否有任何所需数据为空。
答案 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