#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 ...
.