Проверка существования записи в таблице SQL с помощью оператора case - PullRequest
0 голосов
/ 09 апреля 2019

Приведенный ниже запрос возвращает «Найдено», когда записи с идентификатором существуют в таблице служб, но не возвращает «Не найдено», если запись не существует в таблице служб. Я не могу понять, почему.

select case when  exists (select idaccount from services  where idaccount 
=s.idaccount )
 then 'Found'
 else 'NotFound'  end as GSO  
 from services s 
 where s.idaccount in ( 1421)

Ответы [ 2 ]

4 голосов
/ 09 апреля 2019

Ваш запрос будет только когда-либо возвращать строку, если она существует, поэтому оператор case является избыточным, вы также можете написать

SELECT 'Found' FROM services s WHERE s.idaccount IN (1421)

Хотя это не имеет особого смысла, вы можете написать что-то вроде:

SELECT CASE
         WHEN EXISTS (SELECT 1 FROM services WHERE idaccount = 1421)
         THEN 'Found'

         ELSE 'NotFound'
       END

Обратите внимание на отсутствие пункта FROM во внешнем SELECT.Более быстрый способ написать то же самое:

SELECT COALESCE((SELECT 'Found' FROM services WHERE idaccount = 1421), 'NotFound')
1 голос
/ 09 апреля 2019

Ваш внутренний CASE WHEN EXISTS оценивается только , только если внешний запрос находит данные, поэтому вы никогда не видите NotFound.

Версия ниже не только короче, но ибудет работать, потому что CASE WHEN EXISTS всегда оценивается:

select case when exists (
        select 1 from services where idaccount = 1421
    )
    then 'Found'
    else 'NotFound' end as GSO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...