Можно ли использовать IF или CASE в выражении sql FROM - PullRequest
0 голосов
/ 23 марта 2012

У меня длинная хранимая процедура, и я хотел бы внести небольшие изменения в процедуру, не создавая новую (для целей обслуживания)

Можно ли использовать оператор IF или CASE в операторе FROM оператора SELECT для объединения других таблиц? Как это:

from tableA a
join tableB b a.indexed = c.indexed
IF @Param='Y'
BEGIN
    join tableC c a.indexed = c.indexed
END

Кажется, это не сработало для меня. Но мне интересно, возможно ли это вообще и / или имеет ли это смысл.

Спасибо.

Ответы [ 5 ]

3 голосов
/ 23 марта 2012

Нет, это невозможно.Вы можете сделать это только с помощью динамического SQL.

Проклятие и благословения динамического SQL

Введение в динамический SQL

Я бы не советовал использовать Dynamic SQL,Скорее всего, есть лучшие способы выполнить эту операцию, но вам придется предоставить больше информации.

0 голосов
/ 26 марта 2012

Вы не раскрыли вам SELECT предложение.Суть того, что вы хотите, заключается в следующем:

SELECT indexed
  FROM tableA 
INTERSECT 
SELECT indexed
  FROM tableB
INTERSECT 
SELECT indexed
  FROM tableC
 WHERE @Param = 'Y'

Затем используйте это табличное выражение в соответствии с предложением SELECT, например, скажем, вы хотите проецировать только таблицу A:

WITH T
     AS
     (
      SELECT indexed
        FROM tableA 
      INTERSECT 
      SELECT indexed
        FROM tableB
      INTERSECT 
      SELECT indexed
        FROM tableC
       WHERE @Param = 'Y'
     )
SELECT * 
  FROM tableA
 WHERE indexed IN ( SELECT indexed FROM T );
0 голосов
/ 24 марта 2012

Вы можете достичь чего-то подобного, если у вас есть внешнее левое соединение

Рассмотрим

declare @param bit = 1

select a.*, b.*, c.* from a
    inner join b on a.id = b.a_id
    left outer join c on b.id = c.b_id and @param = 1

Это вернет все столбцы из a, b, c.

Теперь попробуйте с

declare @param bit = 0

Это вернет все столбцы из a и b и нули для столбцов c.

Это не сработает, если оба соединения являются внутренними.

0 голосов
/ 24 марта 2012

Хотя то, что вы предложили, невозможно, вы можете поиграть с вашими условиями:

0 голосов
/ 23 марта 2012

Нет, это невозможно. Лучше всего будет выбрать из обеих таблиц и включать только те данные, которые вам интересны. Если вы приведете пример того, что вы пытаетесь сделать, я могу дать лучший ответ.

Попытка на примере:

SELECT t1.id, COALESCE(t2.name, t3.name)
FROM Table1 as t1
LEFT JOIN Table2 as t2
ON t1.id = t2.id
LEFT JOIN Table2 as t3
ON t1.id = t3.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...