2017-03-20 170 views
-1

多种选择我已经尝试IIF,如果其他和案例似乎没有工作。如果@ShippedDate中存在值,则单独查询该值或查询其他值。在哪里条款

WHERE 
    (CASE WHEN @ShippedDate != NULL THEN date_shipped = @ShippedDate 
    ELSE 
    [order].order_date BETWEEN @StartDate AND @EndDate 
    AND program_types.id IN (@ProgTypes) 
    AND employee.id IN (@RepNames) 
    END 
    ORDER BY OrderID 
+0

Case是一个表达式,它用于返回列的值。你不能像这样使用来有条件地换出其他谓词。没有什么东西等于NULL,就像什么都不等于NULL一样。 –

+0

'id IN(@ProgTypes)'?这在SQL Server中甚至可能吗? “@ ProgTypes”是某种数组变量吗? –

+0

@ThorstenKettner确信只要它只包含一个值就可以。 ;)但我怀疑他们没有这样做。 –

回答

0

很确定这样的事情是你在找什么。但是,我不认为你是在这里实际完成的。我注意到你正在使用IN和标量值。如果这些值包含逗号分隔的列表,这仍然不起作用。

WHERE 
(
    date_shipped = @ShippedDate --This will not be true if @ShippedDate is null 
    OR 
    (
     @ShippedDate is null 
     AND 
     [order].order_date BETWEEN @StartDate AND @EndDate 
    ) 
) 
AND program_types.id IN (@ProgTypes) 
AND employee.id IN (@RepNames) 
ORDER BY OrderID 
+0

如果我添加一个日期,我得到所有记录如果我添加空我没有记录。我寻找的逻辑是,如果有一个值,我得到与该值的记录如果为空,那么它会给其余的地方。这似乎并不奏效。 –

+0

哎呀....我在第二部分有一个不是空的倒退。并且请记住,你没有提供太多的细节,所以这里的每个人都在猜测。 –

+0

它的工作,我是这样一个白痴,我有date_shipped ship_date。 TY帮助它按预期工作。 GJ。 –