Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сделать UNION в зависимости от параметра процедуры  [new]
relief
Member

Откуда:
Сообщений: 1197
Привет!

У процедуры есть входной параметр: @bType

Если он 0 - надо выбрать из таблицы А
Если он 1 - надо выбрать из таблицы B
Если он 2 - надо выбрать из таблиц А и B.

Кол-во и название столбцов совпадают.
Кроме писания 3 IF какие еще есть варианты?
4 мар 09, 08:03    [6884258]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
declare @param int
set @param = 2



SELECT 1 AS A WHERE CASE WHEN @param = 0 then 1 when @param = 2 then 1 else 0 end = 1
union 
select 2 AS b WHERE CASE WHEN @param = 1 then 1 when @param = 2 then 1 else 0 end = 1
 
4 мар 09, 08:08    [6884260]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
SELECT 1 AS A WHERE @param in (0, 2)
union 
select 2 AS b WHERE @param in (1, 2)
4 мар 09, 08:22    [6884281]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
relief
Member

Откуда:
Сообщений: 1197
СУПЕР! Благодарю! :)
4 мар 09, 08:25    [6884287]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
delphinchik
Member

Откуда: Москва
Сообщений: 331
tpg
SELECT 1 AS A WHERE @param in (0, 2)
union 
select 2 AS b WHERE @param in (1, 2)


Если в обоих селектах логика выбора одинакова, то ее (логику) прийдется дублировать, что не есть хорошо. Есть другие варианты?
3 авг 09, 17:14    [7491916]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
delphinchik
Если в обоих селектах логика выбора одинакова
Не понял, как это логика может быть одинакова
На примере показать можете?
3 авг 09, 17:19    [7491963]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
delphinchik
Member

Откуда: Москва
Сообщений: 331
Да, забыл. Всегда есть вариант с динамическим SQL, но использовать его не хочется совсем.
3 авг 09, 17:20    [7491964]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
delphinchik
tpg
SELECT 1 AS A WHERE @param in (0, 2)
union 
select 2 AS b WHERE @param in (1, 2)


Если в обоих селектах логика выбора одинакова, то ее (логику) прийдется дублировать, что не есть хорошо. Есть другие варианты?
Почему бы и не сдублировать? По крайней мере это будет для сервера лучше всего.
Можно сделать inline table function и в юнионе селектить из него.
3 авг 09, 17:21    [7491985]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Присоединяюсь к просьбе Паганеля - пример покажите, пожалуйста.
3 авг 09, 17:23    [7491995]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
delphinchik
Да, забыл. Всегда есть вариант с динамическим SQL, но использовать его не хочется совсем.

Тогда пришло время читать про секционирование-partitioning
3 авг 09, 17:25    [7492002]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
delphinchik
Member

Откуда: Москва
Сообщений: 331
Паганель
delphinchik
Если в обоих селектах логика выбора одинакова
Не понял, как это логика может быть одинакова
На примере показать можете?


Например так (таблицы одинаковой структуры):

SELECT 
  1 AS A, 
  [dbo].[fn_GetValue](FieldName) as B, 
  FieldName2, 
  FieldName3*FieldName4-FieldName5 as C 
from 
  TableName1 
WHERE 
  @param in (0, 2) and 
  (FieldName3 > 0) and 
  (FieldName4 in (10, 15)) and 
  exists(select ... where ... = FieldName5)

union 

SELECT 
  2 AS A, 
  [dbo].[fn_GetValue](FieldName) as B, 
  FieldName2, 
  FieldName3*FieldName4-FieldName5 as C 
from 
  TableName2
WHERE 
  @param in (1, 2) and 
  (FieldName3 > 0) and 
  (FieldName4 in (10, 15)) and 
  exists(select ... where ... = FieldName5)


3 авг 09, 17:50    [7492147]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
delphinchik
Member

Откуда: Москва
Сообщений: 331
Glory, каким образом сюда относится секцонирование?
3 авг 09, 17:51    [7492152]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
delphinchik
tpg
SELECT 1 AS A WHERE @param in (0, 2)
union 
select 2 AS b WHERE @param in (1, 2)


Если в обоих селектах логика выбора одинакова, то ее (логику) прийдется дублировать, что не есть хорошо. Есть другие варианты?


SELECT * from (
select *, 0 typ from A 
union 
select *, 1 typ from B 
) x
where <логика выбора> and  @bType in (2,typ)

но возможно лучше и сдублировать
3 авг 09, 17:56    [7492181]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
delphinchik
...
from 
  TableName1 
WHERE 
  @param in (0, 2) and 
  (FieldName3 > 0) and 
  (FieldName4 in (10, 15)) and
...
Здесь данные вибираются из TableName1 и условия выборки накладываются на поля TableName1
delphinchik
...
from 
  TableName2
WHERE 
  @param in (1, 2) and 
  (FieldName3 > 0) and 
  (FieldName4 in (10, 15)) and
...
А здесь данные вибираются из TableName2 и условия выборки накладываются на поля TableName2

А где одинаковость логики?
Как вообще условие TableName1.FieldName3 > 0 может дублировать условие TableName2.FieldName3 > 0 ?
Что Вы вообще подразумеваете под дубляжом?
3 авг 09, 17:56    [7492183]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
delphinchik,

мой предыдущий пост Вам не поможет - надо писать UNION явно или в динамическом запросе (в функциях это запрещено)
3 авг 09, 17:58    [7492194]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
delphinchik
Glory, каким образом сюда относится секцонирование?

Обыкновенным. Если таблицы одинаковой структуры.
3 авг 09, 18:02    [7492215]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
delphinchik
Member

Откуда: Москва
Сообщений: 331
Паганель

А где одинаковость логики?
Как вообще условие TableName1.FieldName3 > 0 может дублировать условие TableName2.FieldName3 > 0 ?
Что Вы вообще подразумеваете под дубляжом?

Честно говоря затрудняюсь дать ответ на такой вопрос. Как мне кажется я наглядно показал, что логика отбора продублирована, она одинакова для обеих случаев. Все отличие в том только, что выбор идет из разных таблиц.
3 авг 09, 18:02    [7492218]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
delphinchik
Member

Откуда: Москва
Сообщений: 331
Glory, таблицы одинаковой структуры. Но все же я не могу понять при чем здесь секционирование. Может простой пример?
3 авг 09, 18:05    [7492231]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
Паганель

Что Вы вообще подразумеваете под дубляжом?
а чем копипастинг не дубляж?
3 авг 09, 18:08    [7492240]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
delphinchik
Как мне кажется я наглядно показал, что логика отбора продублирована, она одинакова для обеих случаев.
Одинакова операциями сравнения и константами? Не вижу ничего плохого, чтобы их "продублировать"
За исключением случая, когда ПО в вечной разработке и можно поменять одно условие и забыть поменять другое
Тогда я уж не знаю, можно коммент в хранимке написать типа "поменял здесь - поменяй и там"
3 авг 09, 18:10    [7492250]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
delphinchik
Member

Откуда: Москва
Сообщений: 331
Паганель, :-). Значит у нас с вами разные взгляды на копипаст. Я как раз вижу в этом плохое.
3 авг 09, 18:12    [7492269]     Ответить | Цитировать Сообщить модератору
 Re: Сделать UNION в зависимости от параметра процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104760
delphinchik
Glory, таблицы одинаковой структуры. Но все же я не могу понять при чем здесь секционирование. Может простой пример?

Мда
create view myview as
..
select partition_nr, * from tableA
union all
select partition_nr, * from tableB


В tableA в partition_nr храниться 0, в tableB в partition_nr храниться 1

select * from myview where partition_nr = @par and <другие условия которые влом дублировать>
3 авг 09, 18:13    [7492270]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить