SQL Server - условный оператор JOIN ON - PullRequest
0 голосов
/ 01 октября 2019

У меня есть особая проблема, когда JOIN ON может основываться на одном из двух операторов:

LEFT JOIN acc_seminar.t_Seminar_Gebühr semg ON 
        CASE 
            WHEN @Bool = 1
                THEN ss1.TNOrder = semg.SemG_TN OR (ss1.TNOrder > @MaxTN AND semg.SemG_TN = @MaxTN)
            ELSE
                semg.SemG_TN = 1
        END

Как вы можете видеть, если переменная имеет значение, равное 1, она должна оставить соединение наодно утверждение или соединение с другим, если значение переменной не равно 1.

Насколько мне подсказывает Googling, что-то подобное невозможно в SQL, поскольку CASE возвращает значение, а не утверждение. Как я могу изменить это, чтобы заставить его логически работать, как показано выше?

1 Ответ

2 голосов
/ 01 октября 2019

CASE - это выражение в T-SQL;Нет Case Заявления на языке.

Здесь вам нужна просто «нормальная» логическая логика:

LEFT JOIN acc_seminar.t_Seminar_Gebühr semg ON (@Bool = 1
                                           AND  ss1.TNOrder = semg.SemG_TN
                                            OR  (ss1.TNOrder > @MaxTN AND semg.SemG_TN = @MaxTN))
                                            OR (@Bool = AND semg.SemG_TN = 1)

Обратите внимание, что подобные объединения могут ухудшить производительность из-за плохого кэширования плана запроса. В результате использование Dynamic SQL или OPTION (RECOMPILE) может помочь избежать использования неверного кэшированного плана или повторного его создания каждый раз (соответственно). Лично я предпочитаю динамический подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...