SQL中的IF和CASE语句都是条件表达式,用于根据条件返回不同的值或执行不同的操作。它们允许在SQL查询中进行逻辑判断和分支处理。
IF
函数通常更简单,适用于简单的二元条件判断CASE
表达式更灵活,可以处理多条件分支IF(condition, value_if_true, value_if_false)
-- MySQL示例
SELECT name, IF(score >= 60, '及格', '不及格') AS result FROM students;
-- 计算折扣
SELECT product_name, price,
IF(price > 1000, price * 0.9, price) AS discounted_price
FROM products;
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
-- 简单CASE示例
SELECT name,
CASE grade
WHEN 'A' THEN '优秀'
WHEN 'B' THEN '良好'
WHEN 'C' THEN '及格'
ELSE '不及格'
END AS grade_description
FROM students;
-- 搜索式CASE示例
SELECT product_name, price,
CASE
WHEN price < 50 THEN '低价'
WHEN price BETWEEN 50 AND 200 THEN '中等'
WHEN price > 200 THEN '高价'
ELSE '未定价'
END AS price_category
FROM products;
-- 在UPDATE中使用CASE
UPDATE employees
SET salary = CASE
WHEN performance = '优秀' THEN salary * 1.2
WHEN performance = '良好' THEN salary * 1.1
ELSE salary * 1.05
END;
原因:没有匹配的条件且缺少ELSE子句
解决:总是包含ELSE子句以确保有默认返回值
-- 错误示例
SELECT CASE WHEN score > 90 THEN 'A' END FROM students;
-- 正确示例
SELECT CASE WHEN score > 90 THEN 'A' ELSE '其他' END FROM students;
原因:复杂的CASE语句可能导致查询性能下降
解决:
原因:各数据库实现略有不同
解决:
原因:CASE各分支返回不同类型的数据
解决:确保所有THEN子句返回兼容的数据类型
-- 错误示例(混合返回字符串和数字)
SELECT CASE WHEN score > 90 THEN 'A' ELSE 0 END FROM students;
-- 正确示例(统一类型)
SELECT CASE WHEN score > 90 THEN 'A' ELSE '0' END FROM students;
-- 统计不同分数段的学生人数
SELECT
COUNT(CASE WHEN score >= 90 THEN 1 END) AS A_count,
COUNT(CASE WHEN score >= 80 AND score < 90 THEN 1 END) AS B_count,
COUNT(CASE WHEN score >= 70 AND score < 80 THEN 1 END) AS C_count,
COUNT(CASE WHEN score < 70 THEN 1 END) AS D_count
FROM students;
-- 自定义排序
SELECT * FROM products
ORDER BY
CASE category
WHEN '电子产品' THEN 1
WHEN '家居用品' THEN 2
WHEN '食品' THEN 3
ELSE 4
END;
-- 根据条件更新不同字段
UPDATE employees
SET
salary = CASE WHEN performance = '优秀' THEN salary * 1.2 ELSE salary END,
bonus = CASE WHEN years_of_service > 5 THEN 5000 ELSE 2000 END;
通过合理使用IF和CASE语句,可以大大增强SQL查询的表达能力和灵活性,实现更复杂的数据处理逻辑。
没有搜到相关的文章