SQL中的coalesce函数与case语句

本文详细介绍了COALESCE函数的功能及其用法,包括返回列表中的第一个非空表达式的特性,并通过实例展示了如何在SQL查询中使用COALESCE函数。此外,还讲解了CASE语句的不同语法模式及其应用。
COALESCE 函数
功能
返回列表中的第一个非空表达式。

语法
COALESCE ( expression, expression [ , ...] )
参数
expression    任意表达式。
标准和兼容性
SQL/92    SQL/92。
SQL/99    核心特性。

示例
下面的语句返回值 34。
SELECT COALESCE( NULL, 34, 13, 0 )
备注
如果所有参数均为 NULL,则 COALESCE 返回 NULL。

COALESCE(expression1,...n) 与此 CASE 函数等效:
CASE   WHEN (expression1 IS NOT NULL) THEN expression1 
... 
WHEN (expressionN IS NOT NULL) THEN expressionN   ELSE NULLEND
尽管 ISNULL 等效于 COALESCE,但它们的行为是不同的。包含具有非空参数的 ISNULL
的表达式将视为 NOT NULL,而包含具有非空参数的 COALESCE 的表达式将视为 NULL。
使用COALESCE的秘密在于大部分包含空值的表达式最终将返回空值(连接操作符“||”
是一个值得注意的例外)。例如,空值加任何值都是空值,空值乘任何值也都是空值,
依此类推。
这样您就可以构建一系列表达式,每个表达式的结果是空值或非空,这就像一个CASE语
句,表达式按照顺序进行测试,第一个满足条件的值就确定了结果。
 
一、CASE(可用于基本SQL和过程中)

1、删除表、创建表、注释、插入数据操作。

DROP TABLE AA_WEEK;

CREATE TABLE AA_WEEK(

CODE SMALLINT NOT NULL,

EN_NAME VARCHAR(20) NOT NULL,

ABB VARCHAR(20),

CONSTRAINT P_AA_WEEK_CODE PRIMARY KEY (CODE)

);

COMMENT ON TABLE AA_WEEK IS

'星期';

COMMENT ON AA_WEEK

(CODE IS '星期代码',

EN_NAME IS '英文星期名',

ABB IS '英文缩写'

);

INSERT INTO AA_WEEK VALUES

(1,'Monday','Mon'),

(2,'Tuesday','Tues'),

(3,'Wednesday','Wed'),

(4,'Thursday','Thurs'),

(5,'Friday','Friday'),

(6,'Saturday','Sat'),

(7,'Sunday','Sun');

COMMIT;

2、CASE查询

两种语法模式:

(1):CASE

WHEN 条件 THEN 结果1

ELSE 结果2

END

(2):CASE 表达式1

WHEN 表达式2 THEN 结果1

ELSE 结果2

END

-- 单值表达式作为条件

SELECT

CASE CODE

WHEN 1 THEN '一'

WHEN 2 THEN '二'

WHEN 3 THEN '三'

WHEN 4 THEN '四'

WHEN 5 THEN '五'

WHEN 6 THEN '六'

WHEN 7 THEN '七'

ELSE 'CODE错误!'

END AS CN_CODE,

EN_NAME

FROM AA_WEEK;

CN_CODE EN_NAME

--------------------

'一' 'Monday'

'二' 'Tuesday'

'三' 'Wednesday'

'四' 'Thursday'

'五' 'Friday'

'六' 'Saturday'

'七' 'Sunday'

'CODE错误!' 'HAHA'

-- 条件直接写到when后面

SELECT

CASE

WHEN CODE = 1 THEN '一'

WHEN CODE = 2 THEN '二'

WHEN CODE = 3 THEN '三'

WHEN CODE = 4 THEN '四'

WHEN CODE = 5 THEN '五'

WHEN CODE = 6 THEN '六'

WHEN CODE = 7 THEN '七'

ELSE 'CODE错误!'

END AS CN_CODE,

EN_NAME

FROM AA_WEEK;

CN_CODE EN_NAME

--------------------

'一' 'Monday'

'二' 'Tuesday'

'三' 'Wednesday'

'四' 'Thursday'

'五' 'Friday'

'六' 'Saturday'

'七' 'Sunday'

'CODE错误!' 'HAHA'

 

二、IF语句格式(仅仅限于DB2过程、触发器、函数中使用)

IF (条件)

THEN 语句;

ELSEIF (条件)

THEN 语句;

ELSEIF (条件)

THEN 语句;

... ...

ELSE

语句;

END IF;
 
EG:
create table 表1(id int,no int,数学1 int,语文 int)
create table 表2(id int,no int,数学2 int,语文 int)
create table 表3(id int,no int,数学3 int,语文3 int)
insert 表1 select 1,1,100,90
insert 表2 select 1,2,85,70
insert 表3 select 1,3,92,60

select id=coalesce(a.id,b.id,c.id),no=coalesce(a.no,b.no,c.no),a.数学1,b.数学2,c.数学3,coalesce(a.语文,b.语文),c.语文3
from 表1 a full join 表2 b on a.id=b.id and a.no=b.no
full join 表3 c on c.id=b.id and c.no=b.no
/*
id          no          数学1         数学2         数学3                     语文3
----------- ----------- ----------- ----------- ----------- ----------- -----------
1           1           100         NULL        NULL        90          NULL
1           2           NULL        85          NULL        70          NULL
1           3           NULL        NULL        92          NULL        60

(3 row(s) affected)
*/
<think>我们被要求使用中文回答,并且遵循特定的格式要求。用户的问题是关于SQLCOALESCE函数的作用及使用示例。 根据提供的引用资料,我们可以总结如下: 作用: COALESCE函数用于返回参数列表中第一个非NULL的值。如果所有参数都为NULL,则返回NULL。它可以接受多个参数。 使用场景: 1. 设置默认值:当某个列可能为NULL时,我们可以使用COALESCE来提供一个默认值。 2. 数据清洗:将NULL值替换为实际的值,便于计算和分析。 3. 条件选择:根据多个列的存在性(是否为空)来选择值。 示例: 1. 引用[3]中的例子:一个表格中有每日生产量(daily_data)和每小时生产量(hourly_data),如果每日生产量为空,则用每小时生产量乘以8来估算日产量。 SELECT COALESCE(daily_data, hourly_data*8) AS daily_info FROM table1; 2. 引用[4]中的例子:在统计消息已读和未读数量时,使用COALESCE来确保即使没有符合条件的记录,也能返回0而不是NULL。 SELECT msg.user_id, COALESCE(SUM(CASE msg.read_flag WHEN '1' THEN 1 ELSE 0 END), 0) AS `read`, COALESCE(SUM(CASE msg.read_flag WHEN '0' THEN 1 ELSE 0 END), 0) AS unRead FROM cto_assist_message msg WHERE ... 3. 引用[2]中提到的设置默认值:例如,将NULL替换为'Unknown'。 SELECT COALESCE(name, 'Unknown') AS user_name FROM users; 另外,我们还可以比较COALESCE其他类似函数(如ISNULL、NVL等)的区别,但用户没有特别要求,这里不展开。 我们将按照要求组织回答: - 使用行内数学表达式时用$...$,但这个问题没有数学表达式,所以不用。 - 独立公式用$$...$$,但这里也没有。 - 使用中文回答。 - 生成相关问题。 注意:在回答中引用的内容需要添加引用标识,如[^1]、[^2]等。我们根据引用的来源进行标注。 由于用户要求结构清晰,我们将分点解释。 回答结构: 1. 函数作用 2. 语法 3. 使用场景(结合示例) 4. 注意事项(可选) 最后,生成相关问题。</think>### SQL COALESCE 函数详解 #### 1. **函数作用** `COALESCE` 是 SQL 中用于处理 `NULL` 值的关键函数,其核心功能是**从参数列表中返回第一个非 `NULL` 的值**。若所有参数均为 `NULL`,则返回 `NULL`。主要用途包括: - **默认值设置**:将 `NULL` 替换为有意义的默认值。 - **数据清洗**:避免计算或聚合时 `NULL` 导致的错误。 - **条件选择**:基于多列的存在性动态取值[^2][^3]。 #### 2. **语法** ```sql COALESCE(expression1, expression2, ..., expressionN) ``` - **参数**:从左到右依次检查,返回第一个非 `NULL` 的表达式值。 - **参数数量**:至少需两个参数,支持无限数量[^2]。 --- #### 3. **使用场景示例** ##### ✅ 场景 1:替换 `NULL` 为默认值 **问题**:用户表中 `nickname` 可能为 `NULL`,需显示为 "匿名用户"。 **解决方案**: ```sql SELECT user_id, COALESCE(nickname, '匿名用户') AS display_name FROM users; ``` - 若 `nickname` 非空 → 显示原值;若为 `NULL` → 显示 "匿名用户"[^2]。 ##### ✅ 场景 2:多列优先级取值 **问题**:生产表需优先取 `daily_data`(日产量),若为空则用 `hourly_data * 8` 估算[^3]。 **解决方案**: ```sql SELECT COALESCE(daily_data, hourly_data * 8) AS daily_production FROM production_log; ``` ##### ✅ 场景 3:聚合函数防 `NULL` **问题**:统计消息已读/未读数时,确保无数据时返回 `0` 而非 `NULL`[^4]。 **解决方案**: ```sql SELECT user_id, COALESCE(SUM(CASE WHEN read_flag = '1' THEN 1 END), 0) AS read_count, COALESCE(SUM(CASE WHEN read_flag = '0' THEN 1 END), 0) AS unread_count FROM messages GROUP BY user_id; ``` ##### ✅ 场景 4:多列合并 **问题**:联系人表中需取第一个非空的联系方式(邮箱 > 电话 > 微信)。 **解决方案**: ```sql SELECT name, COALESCE(email, phone, wechat, '无联系方式') AS contact FROM contacts; ``` --- #### 4. **注意事项** 1. **参数顺序敏感**:函数按从左到右顺序检查,需将高优先级参数放前面。 2. **数据类型一致**:所有参数应兼容(如不能混合数值和文本),否则需显式转换。 3. ** `ISNULL()` 区别**:`ISNULL()` 仅接受两个参数,而 `COALESCE` 支持多个参数[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值