2015-06-08 5 views
0

мне нужны результаты, основанные на состоянии, с использованием динамического SQLиспользованием Case получить значения из другой таблицы в SQL сервере

как когда @param1=10 тогда мне нужно все строки детали из table1

еще мне нужно детали из table2

я пытался что-то вроде ниже, но это не дает результата

declare @param1 int=10; 
select * from 

case when @param1=10 then table1 

else table2 end 

Примечание: я знаю, что я могу использовать, если состояние как ниже

if @param1=10 
select * from table1 
else 
select * from table2 

, но в моем случае запрос очень длинный, так что я не хочу, чтобы заменить все запросы еще раз

, так что я надеюсь, что я просто не могу сделать что-то с футляром без повторной замены всего запроса.

пожалуйста, помогите мне решить проблему

+0

Вы можете использовать динамический SQL. –

+0

@wewesthemenace спасибо за ваш быстрый повтор. есть ли какие-то другие способы, кроме динамического sql? –

+0

Существует, но это может привести к проблемам с производительностью. –

ответ

1

Вы можете разместить UNION ALL как вложенный запрос, а затем построить остальную часть вашего запроса вокруг, что:

SELECT 
    * --TODO - Columns 
FROM 
    (SELECT * FROM tableA WHERE @Param=10 
    UNION ALL 
    SELECT * FROM TableB WHERE @Param<>10) t 
WHERE /* other conditions here */ 

Как и в сторону - если вы имеют две таблицы, которые содержат одни и те же «типы» строк, так что вы хотите их обменивать в запросах, это может быть признаком того, что ваша модель данных нарушена - что должно было быть смоделировано как вместо этого атрибут вместо этого встроен в вашу таблицу имена. Например. вместо того, чтобы иметь таблицы FemaleEmployees и MaleEmployees, это должен быть один стол Employees с колонкой Gender.

+0

здесь это оператор одной строки, но в моем случае сам оператор select содержит более 200 строк, так что я могу снова повторить условие select? –

+0

@ArunprasanthKV - Я не понимаю - вы могли бы взять запрос, который я предоставил в своем ответе, и просто отредактировать две области с комментариями, и вы ничего не будете повторять. –

+0

К сожалению, у меня длинный запрос. Я имею в виду select (длинная последовательность) из таблицы, где условие. поэтому мне нужно повторить выбор два раза ?? –

0

Один из вариантов, чтобы избежать динамического SQL является union:

select * from table1 where @param1 = 10 
union all 
select * from table2 where @param1 <> 10 
+0

Это будет работать, если table1 и table2 имеют одинаковые столбцы. Всегда разумно указывать столбцы, которые вы хотите получить в любом случае, вместо использования asterix (*) – Tom

+0

да, я согласен с вами, но также нужно снова повторить код. Я пытаюсь избежать повторения кода –

0

Если обе таблицы имеют некоторый уникальный идентификатор, чтобы присоединиться, вы можете использовать что-то вроде

SELECT CASE WHEN @param1 = 10 then t1.C1 
ELSE t2.C1 
END as C 
FROM table1 t1 
INNER JOIN table2 t2 on 
t1.Id = t2.Id 

попробуйте это, но вам нужно проверить эффективность вашего запроса.

Declare @t1 Table(id int , Name nvarchar(MAX)) 
Declare @t2 Table(id int , Name nvarchar(MAX)) 
Declare @t int = 10 

insert into @t1 values (1,'Jhon') 
insert into @t1 values (2, 'Jhon2') 

insert into @t2 values (3, 'Rahul') 
insert into @t2 values (4, 'Rahul2') 

Select distinct Case when @t = 10 then t1.Name else t2.Name end as Name 
from @t1 t1 cross join @t2 t2 

другой подход

with CTE_t1 as (Select * from table1 where @param1 = 10), 
    CTE_t2 as (Select * from table2 where @param1 != 10), 
    CTE_t3 as (Select * from CTE_t1 union all Select * from CTE_t2) 

    Select * -- you can use your 200 line of code here only once 
    from CTE_t3 
+0

table1, а таблица2 имеет одинаковые определения столбцов, но между этими таблицами нет общих данных.в некоторых случаях данные будут в таблице 1, а в другом случае данные будут в таблице2 –

+0

, пожалуйста, проверьте новый код в редакции. –

+0

. Я думаю, что CTE будет лучше всего соответствовать вашему сценарию –

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