Как написать запрос T- SQL, который может вернуть 0 строк как часть оператора case - PullRequest
2 голосов
/ 12 марта 2020

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

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

select 'Null check' as id,
case when
count(*) > 0 then NULL
else 'No files detected' end as Message
from TABLE where LASTUPDATEDATE > dateadd(d, -1, getdate())

Этот запрос работает, если обнаружена ошибка, но не в правильный регистр, поскольку он все еще возвращает строку. Как я могу переписать его, чтобы он ничего не возвращал? Спасибо!

Ответы [ 4 ]

2 голосов
/ 12 марта 2020

Кажется, задача для НЕ СУЩЕСТВУЕТ:

select 'Null check' as id, 'No files detected' as Message
where not exists
(
  select *
  from tab
  where lastupdatedate > dateadd(day, -1, getdate())
)
2 голосов
/ 12 марта 2020

По соображениям производительности я бы рекомендовал написать это следующим образом:

select 'Null check' as id, 'No files detected' as Message
from (select top (1) t.*
      from table t
      where lastupdatedate > dateadd(day, -1, getdate())
     ) t
having count(*) = 0;

Это избавит SQL Сервер от необходимости фактически подсчитывать кучу строк, если все в порядке.

1 голос
/ 12 марта 2020

Хитрость заключается в использовании having count(*) = 0

select 'Null check' as id, 'No files detected' as Message
from TABLE 
where LASTUPDATEDATE > dateadd(d, -1, getdate())
having count(*) = 0

Демо

SQL Fiddle - count () = 0
SQL Fiddle - count ()> 0

0 голосов
/ 12 марта 2020

Вы можете выполнить sh это с помощью CASE и подзапроса:

SELECT [Message] = 
    CASE 
        WHEN COALESCE(SELECT COUNT(*) FROM [TABLE] WHERE [LASTUPDATEDATE] > DATEADD(d, -1, GETDATE())), 0) > 0
        THEN 'No files detected'
        ELSE NULL
    END ;
...