SQL - условный оператор ISNULL в запросе - PullRequest
2 голосов
/ 01 апреля 2019

Я использую следующий запрос, чтобы собрать некоторую информацию о каждом ProductId - обратите внимание, что ProductId может содержать несколько записей в таблице dbo.Sales:

SELECT 
c.ProductId, 
COUNT(*) as NumberOfRecords,
(SELECT
 (ISNULL(NULLIF(c.Text, ''), 'FALSE'))) as TextFieldHasData
FROM dbo.Sales c
JOIN dbo.Sources s 
ON c.ProductId = s.ProductId
AND s.SourceStatusId in (1,2)
GROUP BY c.ProductId, c.Status, s.SourceStatusId, c.Text
ORDER BY c.ProductId

Мне нужно настроить часть запроса ISNULL, и у меня возникли проблемы с синтаксисом; на самом деле мне нужно сначала проверить счет NumberofRecords - если счет NumberofRecords для данной записи результата больше 1, то поле TextFieldHadData для этой записи должно просто сказать «N / A». Но если NumberofRecords считается для данной записи результата = 1, то он должен проверить, является ли поле c.Text пустым или пустым. Если равно NULL или пусто, в поле TextFieldHasData будет указано «ЛОЖЬ». Если это не NULL или пусто, поле TextFieldHasData будет иметь значение «ИСТИНА».

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019

Глядя на свой код, возможно, вы ищете что-то вроде следующего (где вы будете группировать до уровня ProductId):

SELECT 
    c.ProductId
    , COUNT(*) as NumberOfRecords
    ,
        CASE
            WHEN COUNT(*) > 1
            THEN 'N/A'
            ELSE
                CASE
                    WHEN SUM(CASE WHEN ISNULL(c.Text, '') = '' THEN 0 ELSE 1 END) > 0
                    THEN 'TRUE'
                    ELSE 'FALSE'
                END
        END TextFieldHasData
FROM
    dbo.Sales c
    JOIN dbo.Sources s ON
        c.ProductId = s.ProductId
        AND s.SourceStatusId in (1, 2)
GROUP BY c.ProductId
ORDER BY c.ProductId
0 голосов
/ 01 апреля 2019

Вы можете использовать запрос:

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

Идея состоит в том, чтобы использовать " case когда ... " sql function

select v.productid,v.NumberOfRecords,
case
       when v.NumberOfRecords>1 then 'N/A'
       when v.NumberOfRecords=1 and isnull(v.TextFieldHasData,'') ='' then 'FALSE'
       else 'TRUE' end [textfieldhasdata]

 from(
SELECT 
c.ProductId, 
COUNT(*) as NumberOfRecords,
(SELECT
 (ISNULL(NULLIF(c.Text, ''), 'FALSE'))) as TextFieldHasData
FROM dbo.Sales c
JOIN dbo.Sources s 
ON c.ProductId = s.ProductId
AND s.SourceStatusId in (1,2)
GROUP BY c.ProductId, c.Status, s.SourceStatusId, c.Text) v
ORDER BY ProductId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...