2015-12-04 2 views
-1

Я застрял здесь. Может ли кто-нибудь помочь в следующем сценарии? Я не могу использовать IN ниже, есть ли другой способ?SQL Server: WHERE, CASE, IN use

DECLARE @Search_type INT = NULL --can be 1/2 
     @search_value INT = NULL --its an id 

SELECT * FROM r_table r 
WHERE 
(
    -- other conditions 
) 
AND 
(
    r.id IN 
    CASE @Search_type 
     WHEN 1 THEN (SELECT e.r_id FROM e_table e WHERE @search_value = e.id) 
     WHEN 2 THEN (SELECT e.r_id FROM e_table e WHERE @search_value = e.b_id) 
    END 
) 
+1

Можете ли вы объяснить, что вы пытаетесь сделать, ожидаемый результат, и что происходит, когда вы используете ваш текущий код? – PHeiberg

+0

Что такое выход? Каков ожидаемый результат? – AVProgrammer

+0

@PHeiberg В первом случае условие i может напрямую сравнить его с идентификатором таблицы с идентификатором search_value Во втором случае я должен сравнить идентификатор таблицы с списком идентификаторов ids'а, который будет получен из оператора select – kiddo

ответ

1

Я не знаю, если это самый простой способ сделать это, но что-то вроде этого должно работать:

AND (
    @Search_type = 1 AND EXISTS (
     SELECT e.r_id FROM e_table e WHERE @search_value = e.id AND e.r_id = r.id) 
    OR 
    @Search_type = 2 AND EXISTS (
     SELECT e.r_id FROM e_table e WHERE @search_value = e.b_id AND e.r_id = r.id) 
) 

See SQL fiddle here

+0

. Для того чтобы просто сказать. Заявление должно работать таким образом. ЕСЛИ (search_type = 1) r.id IN (SELECT e.r_id ОТ e_table е ГДЕ search_value = e.id) ИНАЧЕ ЕСЛИ (search_type = 2) r.id IN (SELECT e.r_id FROM e_table e WHERE search_value = e.b_id) Надеюсь, это поможет вам понять логику. – kiddo

+1

Не это ли мое заявление? Приведите пример входных данных и ожидаемого результата, чтобы мы могли лучше понять вас, если мое решение неверно. Используйте скрипт SQL, с которым я связан, чтобы попробовать его. – PHeiberg

2

Case выражения имеют дело только с скаляров. Единственный запрос, который можно использовать, - это тот, который возвращает скаляр. (Одна строка, один столбец.) Еще один ответ не будет работать, потому что case не работает с булевыми.

Однако в этом случае запрос может быть преобразован в:

SELECT * FROM r_table r 
WHERE 
(
    -- other conditions 
) 
AND 
(
    r.id IN (SELECT e.r_id 
     FROM e_table e 
     WHERE @search_value 
      = CASE @Search_type 
       WHEN 1 THEN e.id 
       WHEN 2 THEN e.b_id 
       ELSE NULL END 
    ) 
) 
+0

Это работало как шарм. Спасибо. – kiddo