Click here to Skip to main content
15,889,775 members
Articles / Database Development / SQL Server

Introduction to SQL Server’s Built-In Logical Functions

Rate me:
Please Sign up or sign in to vote.
5.00/5 (3 votes)
4 Jan 2016MIT5 min read 6.4K   5  
Introduction to SQL Server's built-in logical functions

Logical functions provide a way to use logical conditions to display one of several values You can use logical functions to test a field’s value such as gender (M or F) and display another value (‘Male’ or ‘Female’) as a result.
In this article, we describe how to use the CHOOSE and IIF functions. CHOOSE is really a great way to pick one value from a list of indexed values, whereas IIF provides a compact means to provide the same type of conditional testing found within the CASE statement.

If you are not familiar with SQL functions, then I would recommend staring with the Introduction to SQL Server Built-In Functions.

All the examples for this lesson are based on Microsoft SQL Server Management Studio and the AdventureWorks2012 database. You can get started using these free tools using my Guide Getting Started Using SQL Server.

Introduction to SQL Server’s Built-In Logical Functions

The IIF and CHOOSE functions are new to SQL Server 2012. They allow you to perform comparisons within the select statement to decide which of several values to return.

CHOOSE

The Choose function is used to select a value from a list. It is really handy when you have a numeric value that represents a position, such as the numbers 1 through 12 represent the months of the year, and you want to use them to “map” to another value, such as seasons.

The format for choose is:

SQL
CHOOSE(index, value list)

Given the index, which is a positive number, the CHOOSE function returns the corresponding entry from the value list.

For example:

SQL
SELECT CHOOSE(2, 'A', 'B', 'C')

Returns B.

You can use non integer values, such as FLOAT and DECIMAL, as well. They are implicitly converted to their integer value. Thus:

SQL
SELECT CHOOSE(2.9, 'A', 'B', 'C')

Also returns B since 2.9, when converted to an integer, is 2.

Suppose the Adventure Works hiring manager wants to know the season each hire occurs? What can be done? By using the number of the month, we can use the CHOOSE function to get the season. Here is the CHOOSE function we can use:

SQL
CHOOSE(MONTH(HireDate),
       'Winter', 'Winter', 'Winter',
       'Spring', 'Spring', 'Spring',
       'Summer', 'Summer', 'Summer',
       'Fall', 'Fall', 'Fall')

MONTH is a DateTime function, that returns a number 1-12 which corresponds to the month; January corresponds to 1 and December to 12.

If the HireDate is in October, MONTH is then 10, resulting in ‘Fall,’ the tenth element in the list, to be returned.

Explanation of Choose

How Choose Works

Here is the SQL we can use to obtain the hiring manager’s request:

SQL
SELECT NationalIDNumber,
       JobTitle,
       MONTH(HireDate) as HireMonth,
       CHOOSE(MONTH(HireDate),
              'Winter', 'Winter', 'Winter',
              'Spring', 'Spring', 'Spring',
              'Summer', 'Summer', 'Summer',
              'Fall', 'Fall', 'Fall') as [Hiring Season]
FROM  HumanResources.Employee

One thing to point out is NULL is returned if the CHOOSE function index is less than one or greater than the number of items in the value list.

SQL
SELECT CHOOSE(0, 'A', 'B', 'C')

Returns NULL since the index is less than one, and

SQL
SELECT CHOOSE(4, 'A', 'B', 'C')

does as well, since the index value of 4 is greater than the number of items in the value list.

Here is another example.

Suppose the hiring manager wishes to each employee and a description of their level within the organization. You’ll notice each employee is assigned a level.

The organization levels start at the top with 0 and progress from there. We can use the CHOOSE function to create a mapping between the organization level and description. Since the organization level starts with level 0, we need to add 1; otherwise the first level (0) would always return NULL. Remember, only index values greater than or equal to one are allowed.

After taking this into account, the SQL we can use is:

SQL
SELECT NationalIDNumber,
       JobTitle,
       OrganizationLevel,
       CHOOSE(OrganizationLevel+1,
              'Executive', 'Executive',
              'Upper', 'Middle',
              'Lower', 'Lower') as [Organization Level Name]
FROM  HumanResources.Employee

Though our value lists have returned textual results, there is no reason it couldn’t be another datatype, such as a DATETIME or a numeric value.

The CHOOSE function is a really good fit when you select a value based on another. I think if value list is too large though, you may want to reconsider using another means to map. For instance, you could create a table to serve as a lookup. Keep in mind that CHOOSE is “converted” to a CASE statement, so if you think a CASE statement “smells,” then surely CHOOSE will also stink!

IIF Logical Function

The IIF statement is used to return one of two results based on the result of a Boolean condition.

Here is the general format of the statement:

SQL
IIF ( Boolean expression, true value, false value )

IIF is shorthand for “inline if.” If the Boolean expression is TRUE, then the true value is returned else the false value is returned.

The statement:

SQL
SELECT IIF(10 > 100, '10 is weird', '10 is less than 100')

returns ’10 is less than 100′ since the Boolean expression “10 > 100” is FALSE.

Here is a example using IIF:

SQL
SELECT NationalIDNumber,
       IIF(Gender='F','Female','Male')
FROM  HumanResources.Employee

Here are the results:

IIF used to display values

Using IIF to Display Descriptive Values.

You can nest IIF statements. For instance:

SQL
SELECT NationalIDNumber,
       Gender,
       MaritalStatus,
       IIF(Gender='F',IIF(MaritalStatus='S','Single Female', 'Married Female'),
                      IIF(MaritalStatus='S','Single Male', 'Married Male'))
FROM  HumanResources.Employee

Returns the following values:

Nested IIF Functions

Using Nested IIF’s to Display Results

In this example, the first IIF test for Gender if the Gender is ‘F’ then the green IIF (the one corresponding to the true value position) is evaluated; otherwise the IIF located in the false value position is evaluated.

Order Nested IIF are Executed

Nested IIF Execution Order

Though the above example works, it is hard to read. Before we move on, can you think of a better way to write the expression?

Here is what I came up with…

SQL
SELECT NationalIDNumber,
       Gender,
       MaritalStatus,
       IIF(MaritalStatus='S','Single', 'Married') +
       ' ' +
       IIF(Gender='F','Female', 'Male')
FROM  HumanResources.Employee

I think this is easier to read. The lesson to take from this is that though you can have nested IIF statements, they are harder to read, and if you can, look for another way to write the expression.

In fact, the IIF function is a shortcut for a CASE statement. Here is the same example as a case statement.

SQL
SELECT NationalIDNumber,
       Gender,
       MaritalStatus,
       CASE
           WHEN MaritalStatus = 'S' Then 'Single'
           ELSE 'Married'
       END +
       ' ' +
       CASE
           WHEN Gender = 'F' Then 'Female'
           ELSE 'Male'
       END
FROM  HumanResources.Employee

Though nested IIFs are harder to read, I think they are really useful when the expressions are simple. They are compact; however, if your tests are complex or more than two, which lends itself to nesting IIFs, then I would tend to use a searched CASE statement.

The post Introduction to SQL Server’s Built-In Logical Functions appeared first on Essential SQL.

License

This article, along with any associated source code and files, is licensed under The MIT License


Written By
Easy Computer Academy, LLC
United States United States
Hello my name is Kris. I’m here because I am passionate about helping non-techie people to overcome their fear of learning SQL.

I know what it is like to not know where to start or whether the time spent learning is worth the effort. That is why I am here to help you to:
- Get started in an easy to follow step-by-step manner.
- Use your time wisely so you focus on what is important to learn to get the most value from your time.
- Answer your questions. Really! Just post a comment and I’ll respond. I’m here to help.

It wasn’t long ago that I was helping a colleague with some reporting. She didn’t know where to start and soon got overwhelmed and lost as she didn’t know SQL.

I felt really bad, as she was under pressure to get some summary information to her boss, the built-in reports were falling short, and to make them better would require her to know SQL. At that time that seemed impossible! It in dawned on me, it doesn’t have to be that way.

Then I discovered a way for anyone with the desire to easily learn SQL. I worked with my co-worker, started to teach her what I learned and soon she was able to write reports and answer her boss’ questions without getting stressed or ploughing hours into manipulating data in Excel.

It hasn’t always been easy. Sometimes the information seems abstract or too conceptual. In this case I’ve found out that a visual explanation is best. I really like to use diagrams or videos to explain hard-to-grasp ideas.

Having video, pictures, and text really help to reinforce the point and enable learning.

And now I want to help you get the same results.

The first step is simple, click here http://www.essentialsql.com/get-started-with-sql-server/

Comments and Discussions

 
-- There are no messages in this forum --