Skip to content

shannonlowder.com

Menu
  • About
  • Biml Interrogator Demo
  • Latest Posts
Menu

SELECT CASE

Posted on November 20, 2006 by slowder

A useful skill to learn in SQL is how to translate a value into a description.  You’ll use it all the time.  Whether you’re turning M|F into Male or Female, or turning T|F into True or False, you’ll have to be able to make the translation as quickly as possible.  The easiest way to do that is to master the CASE expression.   Let’s dive right in.

(Please note the following examples have been updated to work with AdventureWorks on 2008R2)

For our first example, we’re going to look at the Employee table, and translate the Salaried Flag from 0, meaning Hourly and 1, meaning Salaried into the actual descriptions Hourly or Salaried.

   1: SELECT DISTINCT 

   2:       SalariedFlag

   3:     , CASE WHEN SalariedFlag = 1 THEN 'Salaried' ELSE 'Hourly' END as SalaryDescription

   4: FROM HumanResources.Employee

When you run this query, you get the following results.

case1

The CASE statement lets you do a logical test, and if it’s true do one thing, and if it results in a false, does another.  There are actually two ways to construct this CASE statement.  The way I’ve already shown is great if you need to test two different values.  Let’s say you needed to test the SalariedFlag and Gender, the syntax above is better for that.  But if you need to handle multiple cases for the same column, then you’ll want to use the following syntax.

   1: SELECT DISTINCT 

   2:       SalariedFlag

   3:     , CASE SalariedFlag 

   4:          WHEN 1 THEN 'Salaried' 

   5:          ELSE 'Hourly' 

   6:       END as SalaryDescription

   7: FROM HumanResources.Employee

Notice the difference in how it’s formed, in the second method we use CASE <column> WHEN, and before we used CASE WHEN <test scenario>.  Both of these methods are useful, you just need to learn when to use each.  The second query still returns the same results.

case1

Let’s take a look at when you’d want to use this second method.  In AdventureWorks for 2008R2, there is a constraint for the Gender column in HumanResources.Employee, it requires you to enter M or F.  I’ve altered the Constraint so you can now enter M, F, or U, for those times you really don’t know and you can’t ask.

We want a CASE statement that can handle all three scenarios.

   1: SELECT DISTINCT 

   2:     Gender

   3:     , CASE Gender

   4:         WHEN 'M' THEN 'Male'

   5:         WHEN 'F' THEN 'Female'

   6:         ELSE 'Unknown'

   7:       END as GenderDescription

   8: FROM HumanResources.Employee

When you run this query against the my test server, you’ll see the following results.

case2

My database has an entry for Pat.  Now that we’ve seen a scenario where we’d want to use the CASE <column> WHEN version… let’s look at the other scenario.  With the other scenario we can test multiple columns with multiple scenarios.

In this example we’ll build a custom description based on color and list price.  When the color is black, we’ll refer to the color as “Gloss Black”, otherwise we’ll only refer to the value stored in the color column.  When the price is greater than or equal to $1000, we’ll refer to the product as expensive, when it’s under $1000, we’ll refer to it as a “Bargain”.

   1: SELECT TOP 10

   2:       Name

   3:     , Color

   4:     , listPrice

   5:     , CASE    

   6:         WHEN Color = 'Black' AND ListPrice >= 1000 THEN 'Expensive Gloss Black'

   7:         WHEN Color = 'Black' AND ListPrice < 1000 THEN 'Bargain Gloss Black'

   8:         WHEN ListPrice >= 1000 THEN 'Expensive ' + Color

   9:         WHEN ListPrice < 1000 THEN 'Bargain ' + Color

  10:       END as CustomDescription    

  11: FROM production.Product

  12: WHERE 

  13:     ListPrice > 0

  14:     AND Color IS NOT NULL

 

Notice how we handle muliple columns in this scenario.  The results of this query appear below.

case3

Learning to use the CASE expression will really take you to the next level in your queries.  Being able to make changes to the results based on values in your data set is a fundamental concept in report writing.  Let me know if you have any questions!

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Recent Posts

  • A New File Interrogator
  • Using Generative AI in Data Engineering
  • Getting started with Microsoft Fabric
  • Docker-based Spark
  • Network Infrastructure Updates

Recent Comments

  1. slowder on Data Engineering for Databricks
  2. Alex Ott on Data Engineering for Databricks

Archives

  • July 2023
  • June 2023
  • March 2023
  • February 2023
  • January 2023
  • December 2022
  • November 2022
  • October 2022
  • October 2018
  • August 2018
  • May 2018
  • February 2018
  • January 2018
  • November 2017
  • October 2017
  • September 2017
  • August 2017
  • June 2017
  • March 2017
  • February 2014
  • January 2014
  • December 2013
  • November 2013
  • October 2013
  • August 2013
  • July 2013
  • June 2013
  • February 2013
  • January 2013
  • August 2012
  • June 2012
  • May 2012
  • April 2012
  • March 2012
  • February 2012
  • January 2012
  • December 2011
  • November 2011
  • October 2011
  • September 2011
  • August 2011
  • July 2011
  • June 2011
  • May 2011
  • April 2011
  • March 2011
  • February 2011
  • January 2011
  • December 2010
  • November 2010
  • October 2010
  • September 2010
  • August 2010
  • July 2010
  • June 2010
  • May 2010
  • April 2010
  • March 2010
  • January 2010
  • December 2009
  • November 2009
  • October 2009
  • September 2009
  • August 2009
  • July 2009
  • June 2009
  • May 2009
  • April 2009
  • March 2009
  • February 2009
  • January 2009
  • December 2008
  • November 2008
  • October 2008
  • September 2008
  • August 2008
  • July 2008
  • June 2008
  • May 2008
  • April 2008
  • March 2008
  • February 2008
  • January 2008
  • November 2007
  • October 2007
  • September 2007
  • August 2007
  • July 2007
  • June 2007
  • May 2007
  • April 2007
  • March 2007
  • February 2007
  • January 2007
  • December 2006
  • November 2006
  • October 2006
  • September 2006
  • August 2006
  • July 2006
  • June 2006
  • May 2006
  • April 2006
  • March 2006
  • February 2006
  • January 2006
  • December 2005
  • November 2005
  • October 2005
  • September 2005
  • August 2005
  • July 2005
  • June 2005
  • May 2005
  • April 2005
  • March 2005
  • February 2005
  • January 2005
  • November 2004
  • September 2004
  • August 2004
  • July 2004
  • April 2004
  • March 2004
  • June 2002

Categories

  • Career Development
  • Data Engineering
  • Data Science
  • Infrastructure
  • Microsoft SQL
  • Modern Data Estate
  • Personal
  • Random Technology
  • uncategorized
© 2025 shannonlowder.com | Powered by Minimalist Blog WordPress Theme