Таблица SELECT SQL, полученная с помощью оператора IF - PullRequest
0 голосов
/ 15 февраля 2010

Привет всем,

Я хочу сделать что-то вроде этого, у меня будет таблица SQL в зависимости от моего параметра,

DECLARE @find varchar(30)
SET @find = 'no'

SELECT * FROM
(

    if @find = 'yes'
    (
    SELECT * FROM myTable
    WHERE ID= '5882'
    )
    ELSE
    (
    SELECT * FROM myTable
    WHERE OLD_ID= '5882'
    )   

) X

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

Ответы [ 3 ]

1 голос
/ 15 февраля 2010

Используйте функцию «search CASE» следующим образом:

WHERE
    CASE 
         WHEN @find = 'no' THEN ID
         WHEN @find = 'yes' THEN OLD_ID
         -- put an ELSE clause here
         -- if you want to catch @find not being no or yes
    END 
    = '5882'
0 голосов
/ 15 февраля 2010

Чтобы обеспечить оптимальные планы выполнения, я бы порекомендовал создавать отдельные запросы и вызывать соответствующие в зависимости от "@find". например SPROC1 будет запрашивать идентификатор SPROC2 будет запрашивать OLD_ID

Затем либо измените свой код вызова для вызова соответствующего sproc, ИЛИ, если вы просто хотите передать @find в качестве параметра, создайте 3-й sproc, который просто действует как перенаправление: SPROC3:

IF (@find = 'no')
    EXECUTE SPROC1
ELSE IF (@find = 'yes')
    EXECUTE SPROC2
ELSE
    ....

Риск с другими подходами заключается в загрязнении плана выполнения, когда план создается для одного пути (например, @ find = 'no'), а затем, когда последующий вызов приходит с @ find = 'yes', он заканчивается использованием дальней менее подходящий план выполнения, что приводит к снижению производительности. Другими словами, вместо использования индекса по идентификатору он может в конечном итоге использовать индекс по OLD_ID, который явно не идеален (и наоборот).

0 голосов
/ 15 февраля 2010

Вы можете использовать EXEC для выполнения строки SQL. Вы должны возражать против цитаты.

DECLARE @column varchar(max);
SET @column = 'OLD_ID'

EXEC('SELECT * FROM myTable WHERE ' + @column + ' = ''5882''')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...