ГДЕ РЕГИСТР, КОГДА оператор THEN с Exists

#sql #sql-server #tsql #case #exists

#sql #sql-сервер #tsql #регистр #существует

Вопрос:

Как правильно это написать:

 declare @p7_ int
set @p7_=1
select * from cdn.tranag
    where  
    case when @p7_=1 then 
    exists(select * from cdn.zrodla join cdn.dziennik on dzk_gidnumer=zro_dtnumer where TrN_GIDTyp=zro_trntyp and TrN_GIDNumer=zro_trnnumer) 
    else -1 end
  

Спасибо.

Комментарии:

1. Добавьте некоторые примеры табличных данных и ожидаемый результат. (Также форматированный текст.) И отметьте используемую вами СУБД.

2. Чего вы пытаетесь достичь?

3. Если параметр = 1, то он существует. Если параметр = 0, то показать все

Ответ №1:

where Предложение в SQL должно сравнивать что-то с чем-то другим. Похоже, вы просто пытаетесь сказать: «верните все, что не @p7_ имеет значения 1 , и в этом случае проверьте, существуют ли записи в другом месте».

Вы можете добиться этого с помощью простых логических операторов, таких как and и or в вашем where предложении:

 select columns
from table
where @p7_ <> 1
   or (@p7_ = 1
       and exists(<exists statement>)
      )
  

Ответ №2:

Это может быть достигнуто с помощью AND/OR логики.

Вы ищете это

 SELECT *
FROM   cdn.Tranag
WHERE  ( @p7_ = 1
         AND EXISTS(SELECT *
                    FROM   cdn.zrodla
                           JOIN cdn.dziennik
                             ON dzk_gidnumer = zro_dtnumer
                    WHERE  TrN_GIDTyp = zro_trntyp
                           AND TrN_GIDNumer = zro_trnnumer) )
        OR @p7_ = 0 
  

Ответ №3:

Я думаю, это то, чего ты хочешь:

 select *
from cdn.tranag t
where (@p7_= 1 and
       exists (select 1
               from cdn.zrodla join
                    cdn.dziennik
                    on dzk_gidnumer = zro_dtnumer
               where t.TrN_GIDTyp = zro_trntyp and
                     t.TrN_GIDNumer = zro_trnnumer
              )
      ) or
      (@p7_ <> 1);
  

Это реализует логику, согласно которой if @p7_ = 1 then exists предложение проверяется. В противном случае выбираются все строки. Примечание: это не проверяется NULL , но это легко добавить.

Также обратите внимание на использование псевдонимов таблиц. Вы всегда должны использовать псевдонимы таблиц, особенно при использовании подзапросов и особенно при наличии нескольких таблиц.

Ответ №4:

Немного дополнительной информации:

В T-Sql EXISTS это логическое выражение с true/false результатом. Однако, в отличие от многих других языков, true/false «значения» в T-Sql не сопоставляются с целочисленными значениями. Другими словами, вы никогда не сможете обрабатывать результат логического выражения T-Sql как INT значение. Они могут использоваться только в предложениях bool, таких как WHERE ... , JOIN ON ... , IF ... и CASE WHEN ... .