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

Откуда:
Сообщений: 2083
Есть, предположим, такая таблица
idxst
10Closed
20Open
30Proposed
40In process
Строчка с idx=10 будет всегда.
Надо реализовать такую логику:
- если у idx=10 столбец st=Closed, то выводить всю таблицу на экран
- если у idx=10 столбец st не равен Closed, то выводить на экран только одну строку, где idx=10

Решается так:
declare @t table (idx int, st varchar(20))
insert @t values (10,'Closed'), (20,'Open'), (30,'Proposed'), (40,'In process')
--select * from @t

if exists (select 1 from @t where idx = 10 and st = 'Closed')
  select * from @t
else
  select * from @t
  where idx = 10

Можно ли обойтись без конструкции IF...ELSE как-нибудь одним запросом через хитрый where ?
14 мар 17, 13:21    [20293187]     Ответить | Цитировать Сообщить модератору
 Re: Запрос. Логика  [new]
Кесарь
Member

Откуда:
Сообщений: 453
user89,

по вашей постановке задачи условие наличия всегда будет исполняться.

Может бы забыли сравнить ещё с какой-то переменной или таблицей?
14 мар 17, 13:25    [20293208]     Ответить | Цитировать Сообщить модератору
 Re: Запрос. Логика  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
user89,
SELECT * FROM @t
WHERE 
	exists (select 1 from @t where idx = 10 and st = 'Closed') OR 
	idx = 10 
14 мар 17, 13:29    [20293229]     Ответить | Цитировать Сообщить модератору
 Re: Запрос. Логика  [new]
Добрый Э - Эх
Guest
user89,

select *
  from t
  where idz = 10 and st != 'Closed'
        or exists (select null from t where idz = 10 and st = 'Closed')
14 мар 17, 13:29    [20293237]     Ответить | Цитировать Сообщить модератору
 Re: Запрос. Логика  [new]
Добрый Э - Эх
Guest
вместо idz читать idx, конечно же.
Добрый Э - Эх
user89,

select *
  from t
  where idx = 10 and st != 'Closed'
        or exists (select null from t where idx = 10 and st = 'Closed')
14 мар 17, 13:31    [20293249]     Ответить | Цитировать Сообщить модератору
 Re: Запрос. Логика  [new]
Mike_za
Member

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

select * 
from @t
	WHERE 
		exists (select 1 from @t where idx = 10 and st = 'Closed') AND 1 = 1
		or 
		idx = 10


но если там больше 100 строк, то так делать не стоит...
14 мар 17, 13:31    [20293251]     Ответить | Цитировать Сообщить модератору
 Re: Запрос. Логика  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
declare @t table (idx int, st varchar(20))
insert @t values (10,'Closed1'), (20,'Open'), (30,'Proposed'), (40,'In process')

select t1.* 
from @t t1
where t1.idx <> 10
	and exists (select * from @t t2 where t2.idx = 10 and t2.st = 'Closed')
	or t1.idx = 10
14 мар 17, 13:39    [20293301]     Ответить | Цитировать Сообщить модератору
 Re: Запрос. Логика  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
t1.idx <> 10
избыточно.
14 мар 17, 13:42    [20293319]     Ответить | Цитировать Сообщить модератору
 Re: Запрос. Логика  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
прям цветник... ещё варианты?
14 мар 17, 13:42    [20293324]     Ответить | Цитировать Сообщить модератору
 Re: Запрос. Логика  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
TaPaK,

нормализация данных.
14 мар 17, 13:49    [20293359]     Ответить | Цитировать Сообщить модератору
 Re: Запрос. Логика  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Лучше всего, конечно, UNION:
SELECT * FROM @t WHERE EXISTS(SELECT * FROM @t WHERE idx = 10 AND st = 'Closed')
UNION ALL
SELECT * FROM @t WHERE idx = 10 AND (st IS NULL OR st <> 'Closed');

Но можно и так (насчёт хорошего плана не уверен):
SELECT * FROM @t WHERE idx = ALL(SELECT idx FROM @t WHERE idx = 10 AND (st IS NULL OR st <> 'Closed'));
14 мар 17, 13:57    [20293408]     Ответить | Цитировать Сообщить модератору
 Re: Запрос. Логика  [new]
user89
Member

Откуда:
Сообщений: 2083
Исходная таблица - это #временная, промежуточная таблица, получается сложным путем из нескольких баз с разных серверов. Я просто привел упрощенный вид...

Всем большое спасибо за такое количество вариантов!
14 мар 17, 14:34    [20293658]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить