определить, являются ли какие-либо значения нулевыми, если true, тогда false, иначе true - PullRequest
8 голосов
/ 25 мая 2011

В настоящее время у меня есть оператор выбора, который проверяет несколько столбцов, чтобы увидеть, есть ли у них данные. если какой-либо из них имеет значение null, тогда я хочу установить бит в 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

Теперь этот код работает, но он немного длинен, мне было интересно, знает ли кто-нибудь о лучшем способе сделать это. обратите внимание, что проверяется несколько типов данных.

дальнейшие детали: этот код находится в представлении, которое просматривается в приложении для обработки заказов на изменение. прежде чем заказ на изменение может быть обработан, он должен пройти некоторые проверки качества данных. это представление показывает, являются ли какие-либо из обязательных данных нулевыми.

Ответы [ 8 ]

11 голосов
/ 25 мая 2011

Просто сложите их, так как 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

из сообщения Я создал более 3 лет назад ...

Имейте в виду, что если у вас есть символы, которые не являются числами, которые нужно преобразовать в 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
5 голосов
/ 25 мая 2011

Я думаю, что я мог бы пойти с этим решением, если кто-то не придумает лучшего, вдохновленного @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
3 голосов
/ 21 июня 2016

Пожалуйста, используйте IIF() (должен быть SQL Server 2012 или более поздней версии) Я очень рекомендую:

IIF(column1 is null, '0', '1')
2 голосов
/ 25 мая 2011

Вы можете инвертировать логику.

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
2 голосов
/ 25 мая 2011

А как насчет этого?

select not(a is null or b is null or ...)
1 голос
/ 25 мая 2011

Создать функцию HasValue, которая принимает sql_variant и возвращает немного. Затем используйте побитовое И в вашем предложении SELECT.

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 голосов
/ 16 марта 2016

Намного проще - просто используйте функцию COALESCE, которая возвращает значение в первом ненулевом столбце.

SELECT Flag = CASE 
    WHEN COALESCE (column1, column2, column3, ...) IS NULL THEN 0
    ELSE 1
   END
FROM MyTable
0 голосов
/ 25 мая 2011

Или это:

 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...