Re: WHERE and CASE

Tech Tip: Click here to run a free scan for Windows Errors and optimize PC performance

From: Adam Machanic (amachanic_at_air-worldwide.nospamallowed.com)
Date: 05/14/04


Date: Fri, 14 May 2004 09:47:09 -0400

CASE is an expression, not a statement; so it returns a value.

WHERE CASE @Manuf WHEN LEN(@Manuf)<3 THEN (ItemStock.SoftHard = 'Soft') ELSE
(ItemStock.SoftHard = 'Soft') AND (ItemStock.Manuf = @Manuf) END

This CASE statement does not return a value.

Instead, you could do something like:

WHERE ItemStock.SoftHard = CASE @Manuf WHEN LEN(@Manuf)<3 THEN 'Soft' ELSE
......

However, I think given your logic you'd be better with:

WHERE ItemStock.SoftHard='Soft' AND (LEN(@Manuf)<3 OR
ItemStock.Manuf=@Manuf)

"shank" <shank@tampabay.rr.com> wrote in message
news:uZ9X2dbOEHA.308@TK2MSFTNGP11.phx.gbl...
> I'm having problems using the CASE statement in my WHERE clause. Not even
> sure this is possible. What I'm trying to achieve is if the length of
@Manuf
> is less than 3 characters, then WHERE (ItemStock.SoftHard = 'Soft'),
> otherwise, WHERE (ItemStock.SoftHard = 'Soft') AND (ItemStock.Manuf =
> @Manuf)
> What am I doing wrong here? I get an error near '<' in this clause
> LEN(@Manuf)<3
> thanks!
> -------------------------------------------------------
> DECLARE @Column varchar(50), @Manuf varchar(70)
> BEGIN
> SELECT DISTINCT ItemStock.Manuf, ItemStock.Label, ItemStock.s_Type,
> ItemPrice.ProPrice, ItemPrice.Retail, ItemPrice.SaleBlurb
> INTO #TempNR
> FROM ItemStock INNER JOIN
> ItemPrice ON ItemStock.OrderNo = ItemPrice.OrderNo
> WHERE CASE @Manuf WHEN LEN(@Manuf)<3 THEN (ItemStock.SoftHard = 'Soft')
ELSE
> (ItemStock.SoftHard = 'Soft') AND (ItemStock.Manuf = @Manuf) END
> GROUP BY ItemStock.OrderNo, ItemStock.Label, ItemStock.Manuf,
> ItemStock.s_Type, ItemPrice.ProPrice, ItemPrice.Retail,
> ItemStock.NewRelease, ItemPrice.SaleBlurb
>
> END
>
> BEGIN
> SELECT #TempNR.*
> FROM #TempNR
>
> ORDER BY
> CASE @Column WHEN 'manuf_asc' THEN #TempNR.Manuf + #TempNR.Label +
> #TempNR.s_Type END ASC,
> CASE @Column WHEN 'label_asc' THEN #TempNR.Label END ASC,
> CASE @Column WHEN 'type_asc' THEN #TempNR.s_Type END ASC,
> CASE @Column WHEN 'price_asc' THEN #TempNR.ProPrice END ASC,
> CASE @Column WHEN 'manuf_desc' THEN #TempNR.Manuf END DESC,
> CASE @Column WHEN 'label_desc' THEN #TempNR.Label END DESC,
> CASE @Column WHEN 'type_desc' THEN #TempNR.s_Type END DESC,
> CASE @Column WHEN 'price_desc' THEN #TempNR.ProPrice END DESC
>
> END
> GO
>
>



Relevant Pages

  • Re: WHERE and CASE
    ... CASE is an expression that returns a value; you can't use it for flow such ... > I'm having problems using the CASE statement in my WHERE clause. ... > SELECT #TempNR.* ...
    (microsoft.public.sqlserver.programming)
  • Re: WHERE and CASE
    ... Andrés ... > I'm having problems using the CASE statement in my WHERE clause. ... > SELECT #TempNR.* ...
    (microsoft.public.sqlserver.programming)
  • WHERE and CASE
    ... I'm having problems using the CASE statement in my WHERE clause. ... What I'm trying to achieve is if the length of @Manuf ... SELECT #TempNR.* ... #TempNR.s_Type END ASC, ...
    (microsoft.public.sqlserver.programming)
  • ORDER BY and CASE
    ... What is wrong with my CASE statement in the ORDER BY clause? ... Syntax error... ... SELECT #TempNR.* ... WHERE NOT(#TempNR.Manuf = 'Amco') ...
    (microsoft.public.sqlserver.programming)