Summary: in this tutorial, you will learn how to use the Oracle DECODE()
function to embed if-then-else logic in SQL queries.
Introduction to Oracle DECODE() function
The Oracle DECODE()
function allows you to add the procedural if-then-else logic to the query.
In the following example, the Oracle DECODE()
function compares the first argument (1) with the second argument (1). Because they are equal, the function returns the third argument which is the string 'One'
:
SELECT
DECODE(1, 1, 'One')
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
It works like the following if
statement
IF 1 = 1 THEN
RETURN 'One';
END IF
Code language: SQL (Structured Query Language) (sql)
The following example is slightly different from the one above. The query returns a null value because one does not equal two.
SELECT
DECODE(1, 2, 'One')
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
If you want to specify a default value when the first argument is not equal to the second one, you append the default value to the argument list as shown below:
SELECT
DECODE(1, 2, 'One','Not one')
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
It works like the following if-then-else statement:
IF 1 = 2 THEN
RETURN 'One';
ELSE
RETURN 'Not one';
END IF;
Code language: SQL (Structured Query Language) (sql)
What if you want to compare the first argument with a list of arguments? See the following example:
SELECT
DECODE(2, 1, 'One', 2, 'Two')
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
The result is:
Two
Code language: SQL (Structured Query Language) (sql)
In this example, the function compares the first argument (2) with the second one. If the first argument equals the second one, the function returns the third argument (One). Otherwise, it compares the first argument with the fourth argument (2). If they are equal, the function returns the fifth argument (Two).
It works like the following if-then-elsif statement:
IF 2 = 1 THEN
RETURN 'One';
ELSIF 2 = 2 THEN
RETURN 'Two';
END IF;
Code language: SQL (Structured Query Language) (sql)
If you want to specify a default value when the function does not find any match, you do it as follows:
SELECT
DECODE(3, 1, 'One', 2, 'Two', 'Not one or two')
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
The query returned:
Not one or two
Code language: SQL (Structured Query Language) (sql)
The query works like the following if-then-elsif-else statement:
IF 3 = 1 THEN
RETURN 'One';
ELSIF 3 = 2 THEN
RETURN 'Two';
ELSE
RETURN 'Not one or two';
END IF;
Code language: SQL (Structured Query Language) (sql)
Oracle DECODE() function syntax
The following illustrates the syntax of the Oracle DECODE()
function:
DECODE (e , s1, r1[, s2, r2], ...,[,sn,rn] [, d]);
Code language: SQL (Structured Query Language) (sql)
Arguments
e
The first argument e is the value to be searched. The function automatically converts e to the data type of s1 before comparing.
s1, s2, .. sn
The s1, s2, … or sn is an expression to search for. Note that s2, s3, … sn are automatically converted to the data type of s1 before comparing.
r1, r2, .. rn
The r1, r2, …, or rn is the expression to return when e is equal to s.
d
d is an expression to return when e does not equal any searched value s1, s2, .. sn.
Return value
The DECODE()
function returns a value with the data type of the first result (r1, r2, .. rn or d) argument.
Note
You can use expressions for the search (s), the result (r), and the default value (d) in the DECODE()
function.
The DECODE()
function evaluates each search value (s1, s2, .., or sn) only before comparing it to the first argument (e), rather than evaluating all search values. In other words, the DECODE()
function never evaluates a search (si+1) when a previous search (si) equals e.
Oracle DECODE() function examples
Let’s take some examples of using the DECODE()
function to see how it works.
A) Use DECODE() function to make data more meaningful
See the following locations
table in the sample database:
The following statements return the country that has at least two locations stored in the database:
SELECT
country_id,
COUNT(*)
FROM
locations
GROUP BY
country_id
HAVING
COUNT(*) >= 2
ORDER BY
country_id;
Code language: SQL (Structured Query Language) (sql)
The country id is quite cryptic. You can use the DECODE()
function to make the country data more meaningful as follows:
SELECT
DECODE(country_id, 'US','United States', 'UK', 'United Kingdom', 'JP','Japan'
, 'CA', 'Canada', 'CH','Switzerland', 'IT', 'Italy', country_id) country ,
COUNT(*)
FROM
locations
GROUP BY
country_id
HAVING
COUNT(*) > =2
ORDER BY
country_id;
Code language: SQL (Structured Query Language) (sql)
B) Oracle DECODE with ORDER BY example
Consider the following employees
table:
The following query uses the DECODE()
function in the ORDER BY
clause to sort the employee’s result set based on an input argument:
SELECT
first_name,
last_name,
job_title
FROM
employees
ORDER BY
DECODE('J', 'F', first_name, 'L', last_name, 'J', job_title);
Code language: SQL (Structured Query Language) (sql)
In this example, we sorted the employee list by job title because we passed the character J
as the first argument of the DECODE()
function.
Oracle DECODE with GROUP BY example
See the following products
table:
The following statement illustrates how to use the DECODE()
function in the GROUP BY
clause. It returns the number of products whose list prices are higher than, equal to, and less than the average list price.
WITH list_prices AS(
SELECT
ROUND(AVG(list_price),2) average
FROM
products
)
SELECT
DECODE( SIGN( (list_price - average ) ),
1, '> Average of ' || average ,
0, 'Average',
-1, '< Average of ' || average) list_price,
COUNT(*)
FROM
products,
list_prices
GROUP BY
DECODE( SIGN( (list_price - average ) ),
1, '> Average of ' || average ,
0, 'Average',
-1, '< Average of ' ||average );
Code language: SQL (Structured Query Language) (sql)
Oracle DECODE() function with SUM() example
We will use the products
and product_categories
tables in this example for the demonstration.
The following example uses the DECODE()
function to change the ranges to the binary number and uses the SUM()
function to count the number of values with a specified range:
SELECT
category_name,
SUM(DECODE(GREATEST(list_price, 0), LEAST(list_price, 1000), 1, 0)) "< 1000",
SUM(DECODE(GREATEST(list_price,1001), LEAST(list_price, 2000), 1, 0)) "1001-2000",
SUM(DECODE(GREATEST(list_price,2001), LEAST(list_price,3000), 1, 0)) "2001-3000",
SUM(DECODE(GREATEST(list_price,3001), LEAST(list_price,8999), 1, 0)) "3001-8999"
FROM
products
INNER JOIN product_categories USING (category_id)
GROUP BY
category_name;
Code language: SQL (Structured Query Language) (sql)
Here is the output:
Oracle DECODE() function and NULL
NULL cannot be compared to anything even NULL. However, DECODE()
function treats two null values are being equal.
The following statement returns the string Equal:
SELECT
DECODE(NULL,NULL,'Equal','Not equal')
FROM
dual;
Code language: SQL (Structured Query Language) (sql)
In this tutorial, you have learned how to use the Oracle DECODE()
function to add procedure if-then-else logic to SQL queries.