2013-07-28 2 views
1

Мне нужно создать отчет из хранимой процедуры SQL Server, где условие такое же, но результаты отличаются для 10 столбцов.Повторить блок CASE с IF/ELSE в SQL

Для этого используется инструкция CASE. Также есть блоки IF/ELSE в каждом CASE. Этот блок IF/ELSE извлекает данные из разных столбцов.

Я повторял одну и тот же саз 10 раз следующим образом:

SELECT  
CASE WHEN table1.Field="aa" 
THEN 
    select table2.Field 
ELSE 
    select table3.Field 
END as 'FirstColumn', 

CASE WHEN table1.Field="aa" 

THEN 
    select table4.Field 
ELSE 
table5.Field END as 'SecondColumn' 

Таким образом, я должен был повторить это же саз 10 раз. Может ли кто-нибудь предложить лучший подход?

+0

table1, таблица2, ..., tableN имеют ту же схему? –

+0

Да все имеют одну и ту же схему – user1672097

+1

Почему бы вам не сделать какую-то таблицу поиска, в которую вы можете «ПРИСОЕДИНИТЬ»? –

ответ

0

Это может быть более подходящим в качестве комментария, но оно слишком длинное.

Ваш SQL не имеет смысла. У вас есть подзапросы в предложении when без круглых скобок, поэтому это недопустимый SQL. Кроме того, у вас есть двойные кавычки вокруг строк, что означает, что "aa" интерпретируется как ссылка на столбец, а не константа. И, наконец, у вас есть одинарные кавычки вокруг псевдонимов столбцов, которые, хотя и разрешены, являются плохими.

Я также не знаю, что вы подразумеваете под «Есть блоки IF/ELSE в каждом CASE», потому что это также недопустимо в SQL.

Если вы имеете в виду:

select (CASE WHEN table1.Field = 'aa' THEN table2.Field 
      ELSE table3.Field 
     END) as FirstColumn, 
     (CASE WHEN table1.Field = 'aa' then table4.Field 
      ELSE table5.Field 
     END) as SecondColumn 

Тогда case утверждение кажется правильно захватить вашу логику. Поскольку table1.field может меняться для каждой строки (в отличие от постоянной для всего запроса), я не вижу способа «упростить» это.

Однако я сделал кучу допущений. Вы можете изменить свой вопрос с лучшим примером фактического кода. Или удалите этот вопрос и начните заново с лучшего объяснения.

1

По вашему примеру условие является одинаковым для всех положений:

table1.Field="aa" 

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

Что-то вроде этого:

DECLARE @Var varchar(2) 
SELECT @Var = Field 
FROM table1 IF @Var = 'aa' BEGIN 
SELECT table2.Field AS 'FirstColumn', 
     table4.Field AS 'SecondColumn' 
FROM table2, 
    table4 END 
ELSE BEGIN 
SELECT table3.Field AS 'FirstColumn' , 
     table5.Field AS 'SecondColumn' 
FROM table3, 
    table5 END 

Вы можете найти рабочий пример на SQLFiddle.

Позвольте мне знать, если я что-то неправильно, и я постараюсь исправить ;-)

Смежные вопросы