Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
igor888
Guest
Добрый день.

Суть такая, есть табличная переменная, с одним столбцом типа INT. Она может быть заполнена, а может и нет. И от этого зависит конструкция WHERE основного запроса.

Примерно так:
SELECT
  ...
  ...
FROM
  ...
  ...
WHERE
  [ID] IN (CASE WHEN EXISTS(SELECT * FROM @T) THEN (SELECT [ID] FROM @T) ELSE 0 END)
18 июн 15, 08:11    [17785747]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
igor888,

SELECT
  ...
  ...
FROM
  ...
  ...
     INNER JOIN @T [t] ON [t].[ID] = [таблица из where].[ID]
18 июн 15, 09:02    [17785851]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SELECT
  ...
  ...
FROM T
  ...
  ...
WHERE
  T.[ID] = ISNULL((SELECT TOP(1) TT.ID FROM @T TT WHERE TT.ID=T.ID),0);
18 июн 15, 09:14    [17785889]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
igor888
Guest
iap,

Спасибо.
Но главное я не сказал.

Надо, если есть данные в табличной переменной, то конструкция where работает иначе нет
что-то типа такого можно придумать:

SELECT
  ...
FROM
  ...
WHERE
  IF EXISTS(SELECT * FROM @CashDesks)
    [DOCS_DocumentSale].[CashDesk] IN (SELECT [CashDesk] FROM @CashDesks)
18 июн 15, 09:20    [17785908]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SELECT
  ...
  ...
FROM T
  ...
  ...
WHERE
  T.[ID] = ALL(SELECT TT.ID FROM @T TT WHERE TT.ID=T.ID);
18 июн 15, 09:38    [17785967]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Или (чуть получше)
SELECT
  ...
  ...
FROM T
  ...
  ...
WHERE EXISTS(SELECT * FROM @T TT WHERE TT.ID=T.ID)
UNION ALL
SELECT
  ...
  ...
FROM T
  ...
  ...
WHERE NOT EXISTS(SELECT * FROM @T);
18 июн 15, 09:40    [17785971]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
SELECT
  ...
  ...
FROM T
  ...
  ...
WHERE
  T.[ID] = ALL(SELECT TT.ID FROM @T TT WHERE TT.ID=T.ID);

Это не совсем точно соответствует Вашим желаниям, посыпаю голову пеплом :((
18 июн 15, 09:41    [17785976]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
igor888
Guest
iap,

Совсем не пойму, что получается по Вашему совету.

Вот что получилось у меня, как думаете?

WHERE
  [DOCS_DocumentSale].[CashDesk] IN (
    CASE WHEN EXISTS(SELECT * FROM @CashDesks) THEN (SELECT [CashDesk] FROM @CashDesks) ELSE [DOCS_DocumentSale].[CashDesk] END)
18 июн 15, 09:45    [17785985]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
igor888
Совсем не пойму, что получается по Вашему совету
Вы про UNION ALL?
Не работает что ли?
18 июн 15, 09:52    [17786016]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
igor888
Guest
Странно конечно, код работает, но не так как хочется.

Что получается, если вот так:
DECLARE @CashDesks TABLE(
  [CashDesk]	INT
)

INSERT INTO @CashDesks ([CashDesk]) VALUES (1)
INSERT INTO @CashDesks ([CashDesk]) VALUES (2)
  
  
SELECT  
...
FROM
...
WHERE
  [DOCS_DocumentSale].[CashDesk] IN (
    CASE WHEN EXISTS(SELECT * FROM @CashDesks) THEN (SELECT [CashDesk] FROM @CashDesks) ELSE [DOCS_DocumentSale].[CashDesk] END) 


Слетает, пишет
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.

Если делать:
DECLARE @CashDesks TABLE(
  [CashDesk]	INT
)

INSERT INTO @CashDesks ([CashDesk]) VALUES (1)
INSERT INTO @CashDesks ([CashDesk]) VALUES (2)
  
  
SELECT  
...
FROM
...
WHERE
  [DOCS_DocumentSale].[CashDesk] IN (SELECT [CashDesk] FROM @CashDesks)


Всё работает.
Не могу понять, что ему не нравится в первом варианте, я ведь применяю "IN"?
18 июн 15, 09:54    [17786028]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
o-o
Guest
declare @CashDesks table(CashDesk int);
declare @DOCS_DocumentSale table(CashDesk int);

insert into @DOCS_DocumentSale values (1), (2);
insert into @CashDesks values (1);

SELECT *
FROM @DOCS_DocumentSale
WHERE (CashDesk IN (SELECT CashDesk FROM @CashDesks)) or (not exists (select * from @CashDesks));

c незакомментаренным insert into @CashDesks values (1);
CashDesk
1

c закомментаренным: -- insert into @CashDesks values (1);
CashDesk
1
2
18 июн 15, 09:54    [17786029]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
igor888
Странно конечно, код работает, но не так как хочется.

Что получается, если вот так:
DECLARE @CashDesks TABLE(
  [CashDesk]	INT
)

INSERT INTO @CashDesks ([CashDesk]) VALUES (1)
INSERT INTO @CashDesks ([CashDesk]) VALUES (2)
  
  
SELECT  
...
FROM
...
WHERE
  [DOCS_DocumentSale].[CashDesk] IN (
    CASE WHEN EXISTS(SELECT * FROM @CashDesks) THEN (SELECT [CashDesk] FROM @CashDesks) ELSE [DOCS_DocumentSale].[CashDesk] END) 



Слетает, пишет
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.

Если делать:
DECLARE @CashDesks TABLE(
  [CashDesk]	INT
)

INSERT INTO @CashDesks ([CashDesk]) VALUES (1)
INSERT INTO @CashDesks ([CashDesk]) VALUES (2)
  
  
SELECT  
...
FROM
...
WHERE
  [DOCS_DocumentSale].[CashDesk] IN (SELECT [CashDesk] FROM @CashDesks)



Всё работает.
Не могу понять, что ему не нравится в первом варианте, я ведь применяю "IN"?
В курсе, что CASE - это скалярная функция, возвращающая ОДНО значение?
18 июн 15, 09:58    [17786047]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
igor888
Guest
iap,

Теперь буду знать, спасибо!
18 июн 15, 10:09    [17786112]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
igor888
Guest
o-o,

Огромное спасибо,
то что нужно.

Ну так и не могу понять как это может работать?!

хитрость вот в этом куске кода:
or (not exists (select * from @CashDesks))


в чём тут фишка?
18 июн 15, 10:15    [17786144]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
o-o
Guest
это дословный перевод того, что вы просили:
или нету вообще записей в табличной переменной -- not exists (select * from @CashDesks),
или значения интересующего поля должны совпасть с теми, что в переменной
18 июн 15, 10:19    [17786159]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
igor888
Guest
o-o
это дословный перевод того, что вы просили:
или нету вообще записей в табличной переменной -- not exists (select * from @CashDesks),
или значения интересующего поля должны совпасть с теми, что в переменной


Допустим записей в табличной переменной нет,
что получается, not exists (select * from @CashDesks) возвращает False т.е. битовое значение

Получается, либо мы берём значения из переменной либо просто False для "пустого поля"))) Мне это то и непонятно... что движет WHERE в этом случае?? мозг вскипел)))
18 июн 15, 10:27    [17786195]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
igor888
Guest
o-o,

Всё понял)))

вопрос закрыт.

А трюк простой и хитрый)))) мне понравился!

Ещё раз спасибо!
18 июн 15, 10:28    [17786199]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
Glory
Member

Откуда:
Сообщений: 104751
igor888
Допустим записей в табличной переменной нет,
что получается, not exists (select * from @CashDesks) возвращает False т.е. битовое значение

Только возвращается True
18 июн 15, 10:29    [17786205]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
afgm
Member

Откуда:
Сообщений: 587
igor888
Ну так и не могу понять как это может работать?!

А он и не работает так как надо. Тестовые данные неверны.

А что мешает написать так?
declare @tbl1 table (id int, cap nvarchar(20))
declare @tbl2 table (id int, cap nvarchar(20))

insert into @tbl1 values(0, 'cap_0'),(1, 'cap_1'),(2, 'cap_2')
insert into @tbl2 values(2, 'cap_3')

select * from @tbl1 t1
where exists(select * from @tbl2 t2 where t2.id = t1.id)
      or
      t1.id = 0


Если в табличной переменной уникальные значения, то можно так
select * from @tbl1 t1
  left join @tbl2 t2 on t1.id = t2.id
  where t2.id is not null or t1.id = 0
18 июн 15, 10:30    [17786216]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
igor888
Guest
afgm,

Всё работает корректно, проверил.
Трюк просто улёт!
18 июн 15, 10:32    [17786221]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
igor888
Guest
Glory
igor888
Допустим записей в табличной переменной нет,
что получается, not exists (select * from @CashDesks) возвращает False т.е. битовое значение

Только возвращается True


Конечно True, иначе бы не работало)))
18 июн 15, 10:33    [17786224]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
Glory
Member

Откуда:
Сообщений: 104751
igor888
Трюк просто улёт!

Какой трюк то ?
18 июн 15, 10:33    [17786230]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
afgm
Member

Откуда:
Сообщений: 587
igor888
Всё работает корректно, проверил.
Трюк просто улёт!

В формулировке вопроса в самом первом посте упомянуто конкретное значение 0.
В трюке я его не вижу.
18 июн 15, 10:35    [17786237]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
igor888
Guest
Glory
igor888
Трюк просто улёт!

Какой трюк то ?


WHERE (CashDesk IN (SELECT CashDesk FROM @CashDesks)) or (not exists (select * from @CashDesks))
18 июн 15, 10:35    [17786239]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в конструкции WHERE использовать что-то на подобии CASE WHEN  [new]
igor888
Guest
afgm
igor888
Всё работает корректно, проверил.
Трюк просто улёт!

В формулировке вопроса в самом первом посте упомянуто конкретное значение 0.
В трюке я его не вижу.


В процессе переписке я изменил первоначальную задачу)))
18 июн 15, 10:37    [17786246]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить