How do I do multiple CASE WHEN conditions using SQL Server 2008?

SqlSql Server-2008

Sql Problem Overview


What I'm trying to do is use more than one CASE WHEN condition for the same column.

Here is my code for the query:

   SELECT	Url='',
			p.ArtNo,
			p.[Description],
			p.Specification,
			CASE 
            WHEN 1 = 1 or 1 = 1 
               THEN 1 
               ELSE 0 
			END as Qty,
			p.NetPrice,
			[Status] = 0
      FROM	Product p (NOLOCK)

However, what I want to do is use more then one WHEN for the same column "qty".

As in the following code:

IF
// CODE
ELSE IF
// CODE
ELSE IF
// CODE
ELSE
// CODE

Sql Solutions


Solution 1 - Sql

There are two formats of case expression. You can do CASE with many WHEN as;

CASE  WHEN Col1 = 1 OR Col3 = 1  THEN 1 
      WHEN Col1 = 2 THEN 2
      ...
      ELSE 0 END as Qty

Or a Simple CASE expression

CASE Col1 WHEN 1 THEN 11 WHEN 2 THEN 21 ELSE 13 END

Or CASE within CASE as;

CASE  WHEN Col1 < 2 THEN  
                    CASE Col2 WHEN 'X' THEN 10 ELSE 11 END
      WHEN Col1 = 2 THEN 2
      ...
      ELSE 0 END as Qty

Solution 2 - Sql

Just use this one, You have to use more when they are classes.

SELECT   Url='',
         p.ArtNo,
         p.[Description],
         p.Specification,
         CASE 
         WHEN 1 = 1 or 1 = 1 
            THEN 1 
         WHEN 2 = 2
             THEN 2
         WHEN 3 = 3
              THEN 3
          ELSE 0 
        END as Qty,
        p.NetPrice,
        [Status] = 0
  FROM  Product p (NOLOCK)

Solution 3 - Sql

You can use below example of case when with multiple conditions.

SELECT
  id,stud_name,
  CASE
    WHEN marks <= 40 THEN 'Bad'
    WHEN (marks >= 40 AND
      marks <= 100) THEN 'good'
    ELSE 'best'
  END AS Grade
FROM Result

Solution 4 - Sql

Something Like this, Two Conditions Two Columns

SELECT ITEMSREQ.ITEM AS ITEM,
       ITEMSREQ.CANTIDAD AS CANTIDAD,
	   (CASE  WHEN ITEMSREQ.ITEMAPROBADO=1 THEN 'APROBADO'
	          WHEN ITEMSREQ.ITEMAPROBADO=0 THEN 'NO APROBADO'
		END) AS ITEMS,
		(CASE 
			  WHEN ITEMSREQ.ITEMAPROBADO = 0 
			  THEN CASE WHEN REQUISICIONES.RECIBIDA IS NULL  THEN 'ITEM NO APROBADO PARA ENTREGA' END
			  WHEN ITEMSREQ.ITEMAPROBADO = 1 
			  THEN CASE WHEN REQUISICIONES.RECIBIDA IS NULL THEN 'ITEM AUN NO RECIBIDO' 
			            WHEN REQUISICIONES.RECIBIDA=1 THEN 'RECIBIDO' 
					    WHEN REQUISICIONES.RECIBIDA=0 THEN 'NO RECIBIDO' 
					   END
			  END)
			  AS RECIBIDA
 FROM ITEMSREQ
      INNER JOIN REQUISICIONES ON
	  ITEMSREQ.CNSREQ = REQUISICIONES.CNSREQ

Solution 5 - Sql

This can be an efficient way of performing different tests on a single statement

select
case colour_txt 
  when 'red' then 5 
  when 'green' then 4 
  when 'orange' then 3
else 0 
end as Pass_Flag

this only works on equality comparisons!

Solution 6 - Sql

case 
    when a.REASONID in ('02','03','04','05','06') then
  	    case b.CALSOC 
            when '1' then 'yes' 
            when '2' then 'no' 
            else 'no' 
        end
	else 'no' 
end 

Solution 7 - Sql

	case when first_condition
	  then first_condition_result_true
	else
	  case when second_condition 
		then second_condition_result_true
	  else
		  second_condition_result_false                              
	  end
	end
  end as qty

Solution 8 - Sql

Its just that you need multiple When for a single case to behave it like if.. Elseif else..

   Case when 1=1       //if
   Then
    When 1=1              //else if
     Then.... 
    When .....              //else if
    Then 
    Else                      //else
   ....... 
     End

Solution 9 - Sql

I had a similar but it was dealing with dates. Query to show all items for the last month, works great without conditions until Jan. In order for it work correctly, needed to add a year and month variable

declare @yr int
declare @mth int

set @yr=(select case when month(getdate())=1 then YEAR(getdate())-1 else YEAR(getdate())end)
set @mth=(select case when month(getdate())=1 then month(getdate())+11 else month(getdate())end)

Now I just add the variable into condition: ...

(year(CreationTime)=@yr and MONTH(creationtime)=@mth)

Solution 10 - Sql

Combining all conditions

select  a.* from tbl_Company a

where  a.Company_ID NOT IN (1,2)  

AND (	
		(0 = 
			CASE WHEN (@Fromdate = '' or @Todate='')
				THEN 0 
				ELSE 1  
			END
		)      -- if 0=0 true , if 0=1 fails (filter only when the fromdate and todate is present)
				OR
		(a.Created_Date between @Fromdate and @Todate ) 				
	)

Solution 11 - Sql

You will get an idea from this code.

SELECT

(CASE
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1001' THEN 'DM'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1002' THEN 'GS'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1003' THEN 'MB'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1004' THEN 'MP'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1005' THEN 'PL'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1008' THEN 'DM-27'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1011' THEN 'PB'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1012' THEN 'UT-2'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1013' THEN 'JGC'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1014' THEN 'SB'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1015' THEN 'IR'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1016' THEN 'UT-3'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1017' THEN 'UT-4'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1019' THEN 'KR'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1020' THEN 'SYB-SB'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1021' THEN 'GR'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1022' THEN 'SYB-KP'
WHEN RIGHT((LEFT(POSID,5)),4) LIKE '1026' THEN 'BNS'

  ELSE ''
END) AS OUTLET

FROM matrixcrm.Transact

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNils AndersView Question on Stackoverflow
Solution 1 - SqlKafView Answer on Stackoverflow
Solution 2 - SqlShankarView Answer on Stackoverflow
Solution 3 - SqlAbhijeet NavgireView Answer on Stackoverflow
Solution 4 - SqlRicardo RoaView Answer on Stackoverflow
Solution 5 - Sqluser2082785View Answer on Stackoverflow
Solution 6 - SqlwennykikkokView Answer on Stackoverflow
Solution 7 - SqlJimocView Answer on Stackoverflow
Solution 8 - SqlHimanshuView Answer on Stackoverflow
Solution 9 - SqlDouglas BentleyView Answer on Stackoverflow
Solution 10 - SqlArun Prasad E SView Answer on Stackoverflow
Solution 11 - Sqldurlove royView Answer on Stackoverflow