#sql #sql-server
#sql #sql-server
Вопрос:
Я хочу использовать оператор join с оператором case и условием добавления, например :
SELECT
TableA.*
FROM
TableA A
INNER JOIN
TableB B ON A.ID = B.TableA_ID
CASE
WHEN @zerocond = 1
THEN AND A.OrganizationId != '0'
WHEN @zerocond = 2
THEN AND COM.OrganizationId IN(1,2)
END
Но этот код приводит к синтаксической ошибке. Кто-нибудь может помочь немного объяснить?
Комментарии:
1.
CASE
это выражение , а не оператор. Он возвращает скалярное значение. Однако не используйтеCASE
выражение в вашемON
илиWHERE
либо; это невозможно. Используйте правильнуюAND
иOR
логическую логику.2. @larnu CASE — это оператор, который использует выражение….
3.
CASE
это выражение, @SQLPro . Боюсь, я не уверен, что говорит ваш комментарий.4. @larnu МЕЖДУ, НАПРИМЕР, CASE, UNION, INTERSECT, EXCEPT, JOIN называются операторами в SQL. Ничего общего с «выражением»…
5. Нет, @SQLPro , это выражение. Смотрите Документацию : «Выражение CASE имеет два формата» , Оно также продолжает ссылаться на него как на выражение на всем протяжении.
Ответ №1:
Case When then
Join
В этом случае использование условия in и Where
предложения in невозможно, то, чего вы пытаетесь достичь, выполнимо с And
помощью и OR
, как показано ниже.
SELECT
TableA.*
FROM
TableA A
INNER JOIN
TableB B ON A.ID = B.TableA_ID
Where ((@zerocond = 1
AND A.OrganizationId != '0')
OR (@zerocond = 2
AND COM.OrganizationId IN(1,2)))
Комментарии:
1. «Использование Case When then в условии соединения и в предложении Where невозможно». Это утверждение является ложным. Вы можете [использовать
CASE
выражение вWHERE
orON
], это просто опрометчиво.2. что вы думаете сейчас?
3. Это решение решило мою проблему. Спасибо @magnus