2013-02-19 2 views
2

У меня есть WHERE заявление, которое выглядит следующим образом:IF Внутри WHERE с хранимой процедурой

WHERE 
    ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Value1, [value1_id])) 
    AND 
    ((@Value2 IS NULL AND [value2_id] IS NULL) OR [value2_id] = ISNULL(@Value2, [value2_id])) 
    AND 
    ((@Value3 IS NULL AND [value3_id] IS NULL) OR [value3_id] = ISNULL(@Value3, [value3_id])) 
    AND 
    ((@Value4 IS NULL AND [value4_id] IS NULL) OR [value4_id] = ISNULL(@Value4, [value4_id])) 
    AND 
    ((@Value5 IS NULL AND [value5_id] IS NULL) OR [value5_id] = ISNULL(@Value5, [value5_id])) 
    AND 
    ((@Value6 IS NULL AND [value6_id] IS NULL) OR [value6_id] = ISNULL(@Value5, [value6_id])) 

мне нужно добавить условную логику внутри ГДЕ, так что я могу сделать специальные вещи с Value5 и Value6. В принципе, если Value5, Value6 или другое значение равно null, я хочу использовать строки Value 5 и Value 6 как есть. Если все три значения не являются NULL, мне нужно выполнить некоторые вычисления значений.

Любые идеи относительно того, что будет лучшим действием?

+0

Вы знаете, что последняя строка отличается? Он имеет смешанное значение «@ Value5»: [value6_id] = ISNULL (@ Value5, [value6_id])) – criticalfix

+0

@criticalfix Спасибо, но это не имеет значения. Я заменил настоящие имена фиктивными именами. – ernest

+0

Вы нашли решение по возникшей проблеме? – Josien

ответ

4

Использование СЛУЧАЙ

«СЛУЧАЙ может быть использован в любом заявлении или оговорке, что позволяет действительное выражение. Например, вы можете использовать СЛУЧАЙ в таких заявлениях, как SELECT, UPDATE, DELETE и SET, и в пунктах, такие как select_list, IN, WHERE, ORDER BY и HAVING. "

http://msdn.microsoft.com/en-us/library/ms181765.aspx

Вы можете выполнять вычисления внутри SELECT как это:

SELECT 
    CASE 
     WHEN @Value7 is not null THEN @Value7 * 100 
     ELSE Value7 * 100 
    END 
FROM #T 
WHERE (@Value1 is null and Value1 is null) 
    AND (@Value2 is null and Value2 is null) 

Это до сих пор не очень понятно, что именно вы пытаетесь достичь. Является ли WHERE не внутри SELECT? Укажите четкий, краткий пример, если вышеуказанное неверно.

+0

Я должен был упомянуть, что я попытался это сделать, но SQL ничего не имеет. В IDE отображается только CAST, когда я начинаю вводить текст и выдает сообщение об ошибке, если там присутствует CASE.Я думаю, что это имеет какое-то отношение к комбинации CASE с AND. – ernest

+0

У вас есть упрощенный пример для нас? Я предположил, что вы на SQL Server ... Что вы используете? Pseudocode пример будет работать –

+0

Я бы попробовал больше с CASE или отправил код с CASE, который дает ошибку. – criticalfix

1

В принципе, если значение Value5, Value6 или другое значение равно null, я хочу использовать значения 5 и значение 6 строк как есть. Если все три значения не являются NULL, Мне нужно выполнить некоторые вычисления по значениям.

Я думаю, что это будет трудно связать, например, с CASE внутри статьи WHERE. Вы могли бы быть лучше с IF строительства за пределами ваших SELECT заявлений:

IF (@Value5 IS NULL OR @Value6 IS NULL OR @OtherValue IS NULL) 
    BEGIN 
    <Statement1AsIs> 
    END 
ELSE 
    BEGIN 
    <Statement2WithComputations> 
    END 

Rewrite ИНЕК

На короткое Замечание, я знаю, что ты не просил за него, но у меня есть ощущение, должно быть «понятнее» способ, чтобы написать эти

((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Value1, [value1_id])) 

Я играл вокруг немного, и это один из способов сказать то же самое:

COALESCE(@Value1, [value1_id], 1001) = COALESCE([value1_id], 1001) 

Это еще один, эквивалент и короче:

@Value1 IS NULL OR [value1_id] = ISNULL(@Value1, [value1_id]) 

Заканчивать этот SQL Fiddle видеть эквивалентность.

Смежные вопросы