parent
8cefadb66c
commit
1c01546024
1 changed files with 184 additions and 0 deletions
@ -0,0 +1,184 @@ |
|||||||
|
--- |
||||||
|
title: Logical Functions |
||||||
|
description: Learn how to use SQL logical functions for conditional operations |
||||||
|
order: 150 |
||||||
|
type: lesson-challenge |
||||||
|
setup: | |
||||||
|
```sql |
||||||
|
CREATE TABLE customer ( |
||||||
|
id INT PRIMARY KEY, |
||||||
|
name VARCHAR(255), |
||||||
|
phone VARCHAR(20), |
||||||
|
email VARCHAR(255) |
||||||
|
); |
||||||
|
|
||||||
|
INSERT INTO customer (id, name, phone, email) VALUES |
||||||
|
(1, 'John Doe', '123-456-7890', 'john.doe@example.com'), |
||||||
|
(2, 'Jane Smith', '098-765-4321', 'jane.smith@example.com'), |
||||||
|
(3, 'Alice Johnson', NULL, 'alice.johnson@example.com'), |
||||||
|
(4, 'Bob Brown', NULL, NULL); |
||||||
|
|
||||||
|
CREATE TABLE product ( |
||||||
|
id INT PRIMARY KEY, |
||||||
|
name VARCHAR(255), |
||||||
|
description VARCHAR(255), |
||||||
|
price DECIMAL(10, 2) |
||||||
|
); |
||||||
|
|
||||||
|
INSERT INTO product (id, name, description, price) VALUES |
||||||
|
(1, 'Product 1', 'Description 1', 10.00), |
||||||
|
(2, 'Product 2', 'Description 2', 20.00), |
||||||
|
(3, 'Product 3', '', 30.00); |
||||||
|
|
||||||
|
CREATE TABLE sale ( |
||||||
|
id INT PRIMARY KEY, |
||||||
|
customer_id INT, |
||||||
|
product_id INT, |
||||||
|
status VARCHAR(1), |
||||||
|
days_pending INT, |
||||||
|
amount DECIMAL(10, 2), |
||||||
|
customer_type VARCHAR(10) |
||||||
|
); |
||||||
|
|
||||||
|
INSERT INTO sale (id, customer_id, product_id, status, days_pending, amount, customer_type) VALUES |
||||||
|
(1, 1, 1, 'P', 3, 1200.00, 'VIP'), |
||||||
|
(2, 2, 2, 'C', 1, 800.00, 'Regular'), |
||||||
|
(3, 3, 3, 'X', 0, 1500.00, 'Regular'), |
||||||
|
(4, 4, 1, 'P', 7, 2000.00, 'VIP'); |
||||||
|
|
||||||
|
CREATE TABLE product ( |
||||||
|
id INT PRIMARY KEY, |
||||||
|
name VARCHAR(255), |
||||||
|
description VARCHAR(255), |
||||||
|
price DECIMAL(10, 2), |
||||||
|
in_stock BOOLEAN |
||||||
|
); |
||||||
|
|
||||||
|
INSERT INTO product (id, name, description, price, in_stock) VALUES |
||||||
|
(1, 'Product 1', 'Description 1', 10.00, true), |
||||||
|
(2, 'Product 2', 'Description 2', 20.00, false), |
||||||
|
(3, 'Product 3', '', 300.00, true); |
||||||
|
``` |
||||||
|
--- |
||||||
|
|
||||||
|
Logical functions help you handle conditional logic and `NULL` values in SQL. These functions are essential for data transformation, handling missing values, and implementing business rules in your queries. |
||||||
|
|
||||||
|
## COALESCE Function |
||||||
|
|
||||||
|
The `COALESCE` function returns the first non-NULL value in a list of expressions. This is particularly useful for handling `NULL` values and providing default values: |
||||||
|
|
||||||
|
```sql |
||||||
|
-- Basic COALESCE examples |
||||||
|
SELECT COALESCE(NULL, 1, 2); -- Returns: 1 |
||||||
|
SELECT COALESCE(NULL, NULL, 3); -- Returns: 3 |
||||||
|
SELECT COALESCE(NULL, NULL, NULL); -- Returns: NULL |
||||||
|
|
||||||
|
-- e.g. when fetching customer data |
||||||
|
SELECT |
||||||
|
name, |
||||||
|
COALESCE(phone, email, 'No Contact') as contact_info |
||||||
|
FROM customer; |
||||||
|
``` |
||||||
|
|
||||||
|
## NULLIF Function |
||||||
|
|
||||||
|
The `NULLIF` function compares two expressions and returns `NULL` if they're equal, otherwise returns the first expression. This is useful for handling special values or converting empty strings to `NULL`: |
||||||
|
|
||||||
|
```sql |
||||||
|
-- Basic NULLIF examples |
||||||
|
SELECT NULLIF(10, 10); -- Returns: NULL |
||||||
|
SELECT NULLIF(10, 20); -- Returns: 10 |
||||||
|
|
||||||
|
-- e.g. to be consistent with empty strings |
||||||
|
SELECT |
||||||
|
id, |
||||||
|
NULLIF(TRIM(description), '') as clean_description |
||||||
|
FROM product; |
||||||
|
|
||||||
|
-- e.g. default values for missing data |
||||||
|
SELECT |
||||||
|
name, |
||||||
|
COALESCE(description, 'No description available') as description, |
||||||
|
COALESCE(price, 0.00) as price, |
||||||
|
COALESCE(in_stock, false) as is_available |
||||||
|
FROM product; |
||||||
|
``` |
||||||
|
|
||||||
|
## CASE Expression |
||||||
|
|
||||||
|
The `CASE` expression provides if-then-else logic in SQL. There are two forms: simple CASE and searched CASE. |
||||||
|
|
||||||
|
### Simple CASE |
||||||
|
|
||||||
|
Used when comparing a value against multiple possible matches: |
||||||
|
|
||||||
|
```sql |
||||||
|
-- Map status codes to descriptions |
||||||
|
SELECT |
||||||
|
id, |
||||||
|
CASE status |
||||||
|
WHEN 'P' THEN 'Pending' |
||||||
|
WHEN 'C' THEN 'Completed' |
||||||
|
WHEN 'X' THEN 'Cancelled' |
||||||
|
ELSE 'Unknown' |
||||||
|
END as status_description |
||||||
|
FROM sale; |
||||||
|
``` |
||||||
|
|
||||||
|
Here is another example using aggregate functions: |
||||||
|
|
||||||
|
```sql |
||||||
|
SELECT |
||||||
|
count(CASE WHEN status = 'P' THEN 1 END) as pending_orders, |
||||||
|
count(CASE WHEN status = 'C' THEN 1 END) as completed_orders, |
||||||
|
count(CASE WHEN status = 'X' THEN 1 END) as cancelled_orders |
||||||
|
FROM sale; |
||||||
|
``` |
||||||
|
|
||||||
|
### Searched CASE |
||||||
|
|
||||||
|
Used for more complex conditions: |
||||||
|
|
||||||
|
```sql |
||||||
|
-- Assign shipping priority |
||||||
|
SELECT |
||||||
|
id, |
||||||
|
CASE |
||||||
|
WHEN customer_type = 'VIP' AND amount > 1000 THEN 'Express' |
||||||
|
WHEN customer_type = 'VIP' OR amount > 1500 THEN 'Priority' |
||||||
|
ELSE 'Standard' |
||||||
|
END as shipping_method |
||||||
|
FROM sale; |
||||||
|
``` |
||||||
|
|
||||||
|
Another example to categorize products by price: |
||||||
|
|
||||||
|
```sql |
||||||
|
SELECT |
||||||
|
name, |
||||||
|
price, |
||||||
|
CASE |
||||||
|
WHEN price >= 100 THEN 'Premium' |
||||||
|
WHEN price >= 50 THEN 'Standard' |
||||||
|
ELSE 'Budget' |
||||||
|
END as price_category |
||||||
|
FROM product; |
||||||
|
``` |
||||||
|
|
||||||
|
Example to calculate discounts based on multiple conditions: |
||||||
|
|
||||||
|
```sql |
||||||
|
SELECT |
||||||
|
id, |
||||||
|
amount, |
||||||
|
customer_type, |
||||||
|
CASE |
||||||
|
WHEN amount >= 1000 AND customer_type = 'VIP' THEN amount * 0.8 |
||||||
|
WHEN amount >= 1000 THEN amount * 0.9 |
||||||
|
WHEN customer_type = 'VIP' THEN amount * 0.95 |
||||||
|
ELSE amount |
||||||
|
END as discounted_amount |
||||||
|
FROM sale; |
||||||
|
``` |
||||||
|
|
||||||
|
Let's look at some exercises to practice these functions and move on to the next chapter about subqueries. |
Loading…
Reference in new issue