IF заявления после CTE - PullRequest
0 голосов
/ 08 июля 2019

Сегодня я столкнулся с этой странной проблемой, связанной с операторами IF. После того, как я закончил замену / создание CTE, у меня были операторы IF после моих CTE, и я продолжал получать следующую ошибку:

Неверный синтаксис рядом с 'if'

Запрос:

-- Other CTE's above.
CTE6 AS 
(
    SELECT
        -- Multiple Columns
    FROM
        table1
)
-- When the Query runs, I'd like it to use the correct IF BLOCK.

-- Error starts here.
if @param_policy = '1' 
    select * from CTE4
    where mid not in (select distinct mid from CTE6)
        and [CN] = @param_policy

if @param_policy = '2' 
    select * from CTE4 
    where mid not in (select distinct mid from CTE6)
        and [CN] = @param_policy

if @param_policy = '3' 
    select * from CTE4 
    where mid not in (select distinct mid from CTE6)
        and [CN] = @param_policy                

if @param_policy = '4' 
    select * from CTE4 
    where mid not in (select distinct mid from CTE6)
        and [CN] = @param_policy   
-- UPDATED

select * from CTE4 WHERE @param_policy = 'batch' and mid not in (select distinct mid from CTE6)

and not
(([Client Number] ='5' and  Pnum = 'IN' )
or ([Client Number] ='6' and  Pnum = 'G')
or [Client Number] in ('7' , '8', '9')
)


Кроме того, чтобы включить, когда он выполняет select * from CTE4, он считает CTE4 недействительным, а также не признает 'mid' допустимым столбцом.

Мои CTE раньше были временными таблицами.

Кто-нибудь знает, как это исправить?

Спасибо.

1 Ответ

6 голосов
/ 08 июля 2019

Вы можете сделать что-то вроде этого:

select *
from CTE4
where @param_policy in ('1', '2', '3', '4')  and
      mid not in (select distinct mid from CTE6) and
      [CN] = @param_policy;

IF - поток управления для кода T-SQL.Он не является частью SELECT синтаксиса запроса.

В более общем смысле вы можете делать то, что хотите, с помощью union all:

select *
from CTE4
where @param_policy in ('1', '2', '3', '4')  and
      mid not in (select distinct mid from CTE6) and
      [CN] = @param_policy
union all
select *
from CTE4 
where @param_policy = 'batch' and
      mid not in (select distinct mid from CTE6) and
      not (([Client Number] ='5' and  Pnum = 'IN' ) or
           ([Client Number] ='6' and  Pnum = 'G') or
           ([Client Number] in ('7' , '8', '9')
          );

Вы также можете добавить эти условия в один запрос, но я думаю, что union all - это более общий подход, который вы ищете.

РЕДАКТИРОВАТЬ:

Или просто использовать более сложную логику в WHERE:

select *
from CTE4
where mid not in (select distinct mid from CTE6) and
      ( (@param_policy in ('1', '2', '3', '4')  and
         [CN] = @param_policy
         ) or
         (@param_policy = 'batch' and
          not (([Client Number] ='5' and  Pnum = 'IN' ) or
               ([Client Number] ='6' and  Pnum = 'G') or
               ([Client Number] in ('7' , '8', '9')
              )
         )
      )
...