Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / database / SQL-Server / SQL-Server-2012

Get Ready to Learn SQL Server: 4. Query Results Using Boolean Logic

4.75/5 (3 votes)
24 Oct 2014MIT5 min read 7K  
Learn more about filtering results returned from your queries using the WHERE clause

In today’s lesson, you’re going to learn more about filtering results returned from your queries using the WHERE clause.

The objectives of today’s lesson are to:

  • Learn to use more than one compare condition at a time using Boolean logic
  • Comprehensive example with Select, Where, and Order By

Using Multiple Conditions

In previous lessons, we learned how the where clause is used to filter out any records where the where condition is FALSE. Did you also know you can also string conditions together to create more complex conditions? To do so, we can use the AND, OR, and NOT operators.

These three operators are used for the most common aspects of Boolean logic. Regardless of which operator is used, the result always boils down to one of two outcomes: TRUE or FALSE.

Where clauses become really interesting when we consider combining more than one field to filter a result. For instance, using our sample database as an example, we may want to find large purchase orders, such as those with an order quantity greater than 10 and unit price greater than $5.00. This could be written as:

SQL
SELECT PurchaseOrderDetailID,
       ProductID,
       OrderQty,
       UnitPrice
FROM   Purchasing.PurchaseOrderDetail
WHERE  UnitPrice > 5.00
       AND OrderQty > 10

Records are only included when both conditions are TRUE.

Now that we know how to write more complicated conditions, let’s learn more about the various Boolean operators. We’ll start with AND.

Boolean AND Operator

The AND operator returns a TRUE only if all conditions are also TRUE. The following truth table shows all combinations of values for conditions (A AND B).

Condition A Condition B Result
TRUE TRUE TRUE
TRUE FALSE FALSE
FALSE TRUE FALSE
FALSE FALSE FALSE

In SQL, we can string a where clause together using to test multiple fields. For instance, if you’re looking for customers from Midland, TX, you could write:

SQL
WHERE State = 'TX' AND City = 'Midland'

You can also use the AND operator to create range condition, much like we do with BETWEEN.

Using our previous example of wanting to find TotalPrices that fall within $100.00 and $200.00 dollars, we would write:

SQL
SELECT PurchaseOrderDetailID,
       ProductID,
       OrderQty,
       UnitPrice,
       UnitPrice * OrderQty AS TotalPrice
FROM   Purchasing.PurchaseOrderDetail
WHERE  UnitPrice * OrderQty >= 100
       AND UnitPrice * OrderQty <= 200

This returns the same result as:

SQL
SELECT PurchaseOrderDetailID,
       ProductID,
       OrderQty,
       UnitPrice,
       UnitPrice * OrderQty AS TotalPrice
FROM   Purchasing.PurchaseOrderDetail
WHERE  UnitPrice * OrderQty BETWEEN 100 AND 200

Tip! Keep in mind that Boolean logic AND doesn’t completely translate to English “and.” For instance, If you were to say Search for all customers in the states of Florida and Georgia, you would most likely know I meant find all customer from either Florida or Georgia. You wouldn’t think I meant for you to find all customers that are in both Florida and Georgia.

Boolean OR Operator

The OR operator returns a TRUE when one or more conditions are also TRUE. Here is the truth table for the OR operator. You’ll see that in every case, one of the conditions is true, so is the end result.

Condition A Condition B Result
TRUE TRUE TRUE
TRUE FALSE TRUE
FALSE TRUE TRUE
FALSE FALSE FALSE

The where clause to select all Customers from either Texas or Florida is:

SQL
WHERE State = 'FL' OR State = 'TX'

Multiple OR clauses can be connected together to behave similar to the IN statement. In this manner, they act as a membership condition.

To find all employees with one of three job titles, we can write:

SQL
SELECT NationalIDNumber,
       BirthDate,
       JobTitle
FROM   HumanResources.Employee
WHERE  JobTitle = 'Design Engineer'
       OR JobTitle = 'Stocker'
       OR JobTitle = 'Buyer'

This is the same as this:

SQL
SELECT NationalIDNumber,
       BirthDate,
       JobTitle
FROM   HumanResources.Employee
WHERE  JobTitle = 'Design Engineer'
       OR JobTitle = 'Stocker'
       OR JobTitle = 'Buyer'

Boolean NOT Operator

Condition A Result
TRUE FALSE
FALSE TRUE

The not operator takes a condition and changes it to the opposite. So given TRUE, the NOT operator changes it to FALSE. Some examples of expressions using the NOT statement include:

  • NOT IN (‘TX’, ‘FL’) – Accept every state except Texas and Florida
  • NOT IN (‘CEO’, ‘Owner’, ‘President’) – Accept everyone that isn’t an owner.

The NOT statement can also be used in combination with AND and OR. However, to explain this, we first need to understand in which order the conditions are evaluated and how to group them together.

In other words, we need to learn about parenthesis and use them much in the same way you would use them with adding and multiplying numbers.

Combining Boolean Operators

The order in which Boolean operators are executed is important and isn’t arbitrary. Much like in arithmetic, where multiplication occurs before additions, in Boolean operators, AND is evaluated before OR.

Can you tell what’s wrong in this photo? What did they really mean?

Image 1

In English, they are trying to say that you can have your choice of soup with either a spring roll or crab Rangoon, but since the AND condition is evaluated first, the SQL engine sees these choices:

  1. Hot & Sour soup
  2. Wonton Soup
  3. Egg Drop Soup and Spring Roll
  4. Crab Rangoon

You can also use parenthesis. The expression inside of the parenthesis is evaluated first.

Let’s say you wanted to return all customers who are not owners. How could we do this?

SQL
ContactTitle = 'CEO'
OR ContactTitle = 'Owner'
OR ContactTitle = 'President'

Now, to get those that aren’t owners, we need to reverse the logic as:

SQL
NOT (ContactTitle = 'CEO'
     OR ContactTitle = 'Owner'
     OR ContactTitle = 'President')

Notice the use of parenthesis, the condition within the parenthesis are evaluated first, then the NOT condition second.

Comprehensive Example

Suppose we need to find all large Purchase Order details entries. If we consider a large Order to be one where the Quantity > 100 or the UnitPrice > 10 and we want to order them by the total price. How would we go about this? Let's try:

SQL
SELECT   PurchaseOrderDetailID,
         ProductID,
         OrderQty,
         UnitPrice,
         UnitPrice * OrderQty AS TotalPrice
FROM     Purchasing.PurchaseOrderDetail
WHERE    (UnitPrice > 10
          OR OrderQty > 100)
ORDER BY TotalPrice

Now we could refine this further by then asserting that the TotalPrice is greater than 1000.

The modified query is:

SQL
SELECT   PurchaseOrderDetailID,
         ProductID,
         OrderQty,
         UnitPrice,
         UnitPrice * OrderQty AS TotalPrice
FROM     Purchasing.PurchaseOrderDetail
WHERE    (UnitPrice > 10
          OR OrderQty > 100)
         AND UnitPrice * OrderQty >= 1000
ORDER BY TotalPrice

I added the parenthesis around the OR clauses so they would be evaluated before the AND; otherwise the statement would have a different result.

One final comment: You notice that I used the column alias TotalPrice in the ORDER BY clause, but didn’t use it in the WHERE clause. This is due to a limitation in SQL Server. Some versions, such as SQLite would allow you to write the following, which is prohibited in SQL Server:

SQL
SELECT   PurchaseOrderDetailID,
         ProductID,
         OrderQty,
         UnitPrice,
         UnitPrice * OrderQty AS TotalPrice
FROM     Purchasing.PurchaseOrderDetail
WHERE    (UnitPrice > 10
          OR OrderQty > 100)
         AND TotalPrice >= 1000
ORDER BY TotalPrice

Congratulations! You just learned how to use multiple conditions to create more sophisticated filtering conditions. More tutorials are to follow! Remember! I want to remind you all that if you have other questions you want answered, then post a comment or tweet me. I’m here to help you. What other topics would you like to know more about?

License

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