Оператор CASE внутри EXISTS

Мне нужно создать запрос, который выглядит так:

SELECT attr
FROM SomeTable B
WHERE EXISTS
(СЛУЧАЙ, КОГДА B.some_attr = 0
THEN (SELECT x FROM C WHERE Bz = z)
WHEN B.some_attr = 1
ТОГДА (ВЫБЕРИТЕ x ИЗ D, ГДЕ Bz = x)
КОНЕЦ)

Но SQL Server отказывается выполнять это, что приводит к некоторой синтаксической ошибке.
Как изменить этот запрос, чтобы он работал?

EDIT: я добавляю ошибку:

Сообщение 156, уровень 15, состояние 1, строка 4 Неверный синтаксис рядом с ключевым словом «CASE».
Сообщение 156, уровень 15, состояние 1, строка 6 Неверный синтаксис рядом с ключевым словом 'WHEN'.
Сообщение 102, уровень 15, состояние 1, строка 8 Неверный синтаксис рядом с ')'.


person superM    schedule 20.07.2012    source источник
comment
«Некоторая синтаксическая ошибка» будет большим подспорьем для всех, кто захочет вам помочь.   -  person Dave Richardson    schedule 20.07.2012


Ответы (3)


Попробуй это:

SELECT A 
FROM B 
WHERE 
     CASE 
     WHEN B.some_attr = 0 AND EXISTS(SELECT x FROM C WHERE B.z = z) THEN 1
     WHEN B.some_attr = 1 AND EXISTS(SELECT x FROM D WHERE B.z = x) THEN 1
     END = 1
person Michael Buen    schedule 20.07.2012

Попробуй это:

SELECT A
FROM B
WHERE 
    (CASE WHEN B.some_attr = 0
          THEN (SELECT x FROM C WHERE B.z = z)
          WHEN B.some_attr = 1
          THEN (SELECT x FROM D WHERE B.z = x)
     END) is not null

Это предполагает, что подзапросы возвращают одну строку. Если нет, просто введите max(x), а не x.

person Gordon Linoff    schedule 20.07.2012

Я думаю, что это также должно работать:

SELECT attr 
FROM SomeTable B 
WHERE EXISTS (
    SELECT 1 FROM C WHERE B.some_attr = 0 AND B.z = z UNION ALL
    SELECT 1 FROM D WHERE B.some_attr = 1 AND B.z = x
)
person Bort    schedule 20.07.2012