sql语法 DECODE, CASE ... WHEN

DECODE

DECODE 是 Oracle 数据库的专有函数, MySQL 和 SQL Server 并不原生支持 DECODE 函数。

默认语法

sql 复制代码
DECODE(expr, search1, result1, search2, result2, ..., default_result)

由此可知, 最后一个是默认值

sql 复制代码
SELECT employee_id, 
       DECODE(department_id,
              10, salary * 0.1,
              20, salary * 0.15,
              30, salary * 0.2,
              salary * 0.05) AS bonus
FROM employees;
sql 复制代码
在这里插入代码片

奖金计算方式,

department_id: 10, 薪资0.1; 20,薪资0.15

sql 复制代码
SELECT employee_id, 
       DECODE(commission_pct, NULL, 0, commission_pct) AS commission_percentage
FROM employees;

上面的代码是处理空值的, 如果为null,则是0, 否则输出原值

功能限制:DECODE 只能进行等值判断(=),不支持大于(>)、小于(<)或 IN 等范围比较。如果逻辑复杂,CASE WHEN 会更加灵活

CASE WHEN

正如前面提到的,CASE WHEN 是 SQL 中用于实现条件逻辑的标准表达式,它不仅是 DECODE 函数的最佳替代方案,而且功能更加强大和灵活.

sql 复制代码
SELECT name, salary,
    CASE performance_level
        WHEN 'High' THEN 'Performance is excellent'
        WHEN 'Medium' THEN 'Performance is satisfactory'
        WHEN 'Low' THEN 'Performance needs improvement'
        ELSE 'Performance level not specified'
    END AS performance_description`在这里插入代码片`
FROM employees;
sql 复制代码
SELECT ProductNumber, Name,
    CASE
        WHEN ListPrice = 0 THEN 'Mfg item - not for resale'
        WHEN ListPrice < 50 THEN 'Under $50'
        WHEN ListPrice >= 50 AND ListPrice < 250 THEN 'Under $250'
        WHEN ListPrice >= 250 AND ListPrice < 1000 THEN 'Under $1000'
        ELSE 'Over $1000'
    END AS Price_Range
FROM Production.Product;
  • 短路求值:CASE 表达式会按照 WHEN 子句出现的顺序进行评估。一旦遇到第一个计算结果为 TRUE 的条件,就会立即返回对应的结果,并停止后续条件的计算。
  • ELSE 子句是可选的:如果所有的 WHEN 条件都不满足,且没有提供 ELSE 子句,CASE 表达式将默认返回 NULL 值。
  • 应用广泛:除了 SELECT 查询,CASE WHEN 还可以用在 UPDATE、DELETE、WHERE、ORDER BY 和 HAVING 等子句中。
  • 跨数据库兼容:CASE WHEN 是 ANSI SQL 标准的一部分,这意味着它在 Oracle、MySQL、SQL Server、PostgreSQL 等几乎所有主流数据库中都能通用。

case when 后面 表达式

在 SQL 中,CASE WHEN 表达式非常灵活,它支持两种主要的语法结构,而 WHEN 后面的条件判断几乎可以包含 SQL 中所有的逻辑表达式

等值比较

sql 复制代码
CASE status
    WHEN 1 THEN '待处理'
    WHEN 2 THEN '已完成'
    ELSE '未知'
END

范围与条件判断

sql 复制代码
CASE 
    WHEN age >= 18 AND age <= 60 THEN '成年人'
    WHEN age > 60 THEN '老年人'
    ELSE '未成年人'
END

逻辑组合

sql 复制代码
CASE 
    WHEN department = 'IT' AND level >= 3 THEN '高级IT'
    WHEN department = 'HR' OR department = 'Finance' THEN '后台支持'
    ELSE '普通员工'
END

空值判断(IS NULL)

sql 复制代码
CASE WHEN t2.mc_id IS NOT NULL THEN '1' ELSE '2' END AS our_type
sql 复制代码
CASE 
    WHEN phone_number IS NULL THEN '未填写'
    WHEN phone_number != '' THEN '已填写'
    ELSE '无效号码'
END

嵌套子查询

sql 复制代码
CASE 
    WHEN EXISTS (SELECT 1 FROM orders WHERE orders.user_id = users.id) THEN '有订单用户'
    ELSE '无订单用户'
END

字符串匹配

sql 复制代码
CASE 
    WHEN email LIKE '%@gmail.com' THEN 'Gmail用户'
    WHEN email LIKE '%@qq.com' THEN 'QQ用户'
    ELSE '其他邮箱'
END

结合内置函数

sql 复制代码
CASE 
    WHEN LENGTH(password) < 8 THEN '密码太短'
    WHEN TO_CHAR(create_time, 'YYYY') = '2024' THEN '今年注册'
    ELSE '正常'
END
相关推荐
小白说大模型19 小时前
LLM集成数据库的幻觉治理:当AI给出的SQL建议是错的
数据库·人工智能·sql·oracle·重构·开源
zcmodeltech20 小时前
工程机械与矿山机械沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的露天开采-井下掘进-智慧矿山全场景联动方案
数据库·stm32·单片机·嵌入式硬件·制造·多分类
曹牧20 小时前
Oracle:空值排序
数据库·oracle
SelectDB20 小时前
Apache Doris 与 StarRocks 深度对比:2026 年 OLAP 引擎选型指南
数据库
lbb 小魔仙21 小时前
谁替 AI Agent 记住时间?——从航海钟到智能数据库,三百年时延坍缩史
数据库·人工智能·db
Csvn21 小时前
📊 SQL 入门 Day 19:事务与隔离级别
后端·sql
这个DBA有点耶21 小时前
读懂半连接:IN/EXISTS子查询什么时候快、什么时候慢?
数据库·性能优化·架构
01_ice21 小时前
MySQL内外连接
数据库·mysql
ClouGence1 天前
2026 年 4 款数据库管理工具推荐:免费、开源、付费怎么选?
数据库·后端·开源
SelectDB1 天前
招联金融数仓升级:Apache Doris 统一 OLAP 引擎实现降本提效实践
数据库