sql coalesce函数 (全网最详细解读 案例)

这篇具有很好参考价值的文章主要介绍了sql coalesce函数 (全网最详细解读 案例)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

 一、函数COALESCE

二、解读 

三、使用

1.0版本 

2.0版本——行转列中会用到coalesce()

案例sql


 一、函数COALESCE

COALESCE(expression_1, expression_2, ...,expression_n)

二、解读 

coalesce( f1, f2, f3, ... fn)

coalesce用于:f1有值,返回f1,若为null,则看f2,f2有值,则返回f2,若为null,继续往后。以此类推。

简单说就是:f1若为null,则取f2,f2若为null,则取f3,以此类推。

三、使用

1.0版本 

select coalesce(start_time,end_time,'2023-01-01') from t1

        如果start_time有值,则取的是start_time的值,如果start_time为null,则取end_time,如果end_time也为null,则返回2023-01-01

2.0版本——行转列中会用到coalesce()

        例如:一个单号下,有多条数据,状态值不一样。即 group by id,status;,一个id下有多种status。现在希望:这个id下,如果status的值既有 状态1 也有 状态2,则使用 状态1,如果没有 状态1 只有 状态2,就使用状态2。但由于是多行数据,行与行的对比很复杂。

        先进行 行转列,将这个id下的多行数据转成一行。status的值作为不同的字段保存。

sql如下:

select id,
max((case status when 'input' then data end )) as status_input,
max((case status when 'output' then data end)) as status_output

from t1
group by id

结果大致如下:没有值的就为null

factory|start_date|input_value|auto_value|
-------+----------+-----------+----------+
t1     |2023-06-01|   15.23152|          |
t1     |2023-06-02|   16.23152|  17.23152|
t1     |2023-06-03|   19.23152|  18.23152|
t1     |2023-06-04|           |  20.23152|
t1     |2023-06-05|           |  43.46304|
t1     |2023-06-06|           |  15.23152|

 再对其使用 coalesce() ,如下

select id,
coalesce(max((case status when 'input' then data else null end )),max((case status when 'output' then data else null end)),'') as status
from t1
group by id

意思是:如果 input 有值,就使用 input 那行的 data,如果 input 为 null,就使用 output 那行的data。

结果大致如下:

factory|start_date|value   |
-------+----------+--------+
t1     |2023-06-01|15.23152|
t1     |2023-06-02|16.23152|
t1     |2023-06-03|19.23152|
t1     |2023-06-04|20.23152|
t1     |2023-06-05|43.46304|
t1     |2023-06-06|15.23152|

具体的案例请看这篇文章:

sql 行转列 case when (简洁版) —— group by 行与行比较【mysql】

案例sql

文章到此已结束,下面是案例测试需要用到的sql。

需求大致为:订单状态流转表中,存了该订单的被操作过的多种状态,待付款,已付款,取消订单,确认收货,退款。

现在,要选出一个订单当前处于某重要节点的时间。例如:如果有确认收货,则使用确认收货的时间,如果没有,则使用取消订单的时间,如果没有,则使用待付款的时间。

建表

CREATE TABLE `order_status` (
  `order_no` varchar(64) NOT NULL COMMENT '订单号',
  `status` varchar(20) DEFAULT NULL COMMENT '订单状态',
  `update_date` datetime DEFAULT NULL COMMENT '修改时间'
)comment '订单明细'

 数据

INSERT INTO order_status(order_no, status, update_date)VALUES
('1673669924273856513', '待付款',    '2023-06-01 06:21:02'),
('1673669924273856513', '取消订单',  '2023-06-01 06:22:02'),
('1673669924319993859', '待付款',    '2023-06-01 06:23:02'),
('1673669924319993859', '已付款',    '2023-06-01 06:24:02'),
('1673669924319993859', '退款',      '2023-06-01 06:25:02'),
('1673669924319993859', '取消订单',  '2023-06-01 06:26:02'),
('1673669924319993863', '待付款',    '2023-06-01 06:27:02'),
('1673669924319993863', '已付款',    '2023-06-01 06:28:02'),
('1673669924319993863', '确认收货',  '2023-06-01 06:29:02');

1.0版

查询sql

先将行转列,将一个订单的多条数据转成一条。创建不同的字段来存储需要的值(这里需要的值是时间),这些字段对应不同的status的值,存相应的时间。

select 
order_no,
max(case when status='确认收货' then update_date end) as received_time,
max(case when status='取消订单' then update_date end) as cancel_time,
max(case when status='待付款' then update_date end) as nonpay_time

from order_status
group by order_no

结果:没有值的为null

order_no           |received_time      |cancel_time        |nonpay_time        |
-------------------+-------------------+-------------------+-------------------+
1673669924273856513|                   |2023-06-01 06:22:02|2023-06-01 06:21:02|
1673669924319993859|                   |2023-06-01 06:26:02|2023-06-01 06:23:02|
1673669924319993863|2023-06-01 06:29:02|                   |2023-06-01 06:27:02|

2.0版 

查询sql

在1.0基础上使用 coalesce,如果确认收货的时间为null,则使用取消订单的时间,如果取消订单的时间为null,则使用待付款,待付款也为null,则给个默认值1900-01-01

select 
order_no,
COALESCE (max(case when status='确认收货' then update_date end),
		  max(case when status='取消订单' then update_date end),
		  max(case when status='待付款' then update_date end),
		  '1900-01-01'
		  ) as update_date
from order_status
group by order_no

结果:

order_no           |update_date        |
-------------------+-------------------+
1673669924273856513|2023-06-01 06:22:02|
1673669924319993859|2023-06-01 06:26:02|
1673669924319993863|2023-06-01 06:29:02|

====================分界线=====================

以下为紫薯布丁

CREATE TABLE `order_status` (
  `order_no` varchar(64) NOT NULL COMMENT '订单号',
  `status` varchar(20) DEFAULT NULL COMMENT '订单状态',
  `update_date` datetime DEFAULT NULL COMMENT '修改时间'
)comment '订单明细'
 

INSERT INTO order_status(order_no, status, update_date)VALUES
('1673669924273856513', '待付款',    '2023-06-01 06:21:02'),
('1673669924273856513', '取消订单',  '2023-06-01 06:22:02'),
('1673669924319993859', '待付款',    '2023-06-01 06:23:02'),
('1673669924319993859', '已付款',    '2023-06-01 06:24:02'),
('1673669924319993859', '退款',      '2023-06-01 06:25:02'),
('1673669924319993859', '取消订单',  '2023-06-01 06:26:02'),
('1673669924319993863', '待付款',    '2023-06-01 06:27:02'),
('1673669924319993863', '已付款',    '2023-06-01 06:28:02'),
('1673669924319993863', '确认收货',  '2023-06-01 06:29:02');
 

select 
order_no,
max(case when status='确认收货' then update_date end) as received_time,
max(case when status='取消订单' then update_date end) as cancel_time,
max(case when status='待付款' then update_date end) as nonpay_time

from order_status
group by order_no

order_no           |received_time      |cancel_time        |nonpay_time        |
-------------------+-------------------+-------------------+-------------------+
1673669924273856513|                   |2023-06-01 06:22:02|2023-06-01 06:21:02|
1673669924319993859|                   |2023-06-01 06:26:02|2023-06-01 06:23:02|
1673669924319993863|2023-06-01 06:29:02|                   |2023-06-01 06:27:02|

select 
order_no,
COALESCE (max(case when status='确认收货' then update_date end),
          max(case when status='取消订单' then update_date end),
          max(case when status='待付款' then update_date end),
          '1900-01-01'
          ) as update_date
from order_status
group by order_no

order_no           |update_date        |
-------------------+-------------------+
1673669924273856513|2023-06-01 06:22:02|
1673669924319993859|2023-06-01 06:26:02|
1673669924319993863|2023-06-01 06:29:02|文章来源地址https://www.toymoban.com/news/detail-762731.html

到了这里,关于sql coalesce函数 (全网最详细解读 案例)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Coalesce:处理Null值,返回传入的多个字段(属性)中第一个非空的值

    Coalesce函数是SQL中的一个函数,用于返回参数列表中第一个非空的表达式的值。Coalesce函数接受两个或多个参数,它会按顺序依次检查每个参数,返回第一个非空的参数值。如果所有参数都为空,则返回NULL。 Coalesce函数可以用于在SQL中处理空值的情况。在实际的数据处理中,

    2024年02月09日
    浏览(46)
  • 第五篇【传奇开心果系列】Python文本和语音相互转换库技术点案例示例:详细解读pyttsx3的`preprocess_text`函数文本预处理。

    pyttsx3在文本转换语音之前,首先要开展系列步骤的文本预处理工作。 这些预处理步骤可以在使用 pyttsx3 之前应用于文本,以提高转换结果的质量和可读性。预处理后的文本更干净、准确,可以更好地用于语音转换。pyttsx3主要使用 preprocess_text 函数开展文本预处理。 下面是一

    2024年02月22日
    浏览(54)
  • Oracle sql sum函数返回null,默认值0

    在Oracle SQL中,当你使用 SUM 函数对一组值进行求和时,如果这组值中包含 NULL ,那么 SUM 函数将忽略这些 NULL 值,并返回非 NULL 值的总和。 如果你希望在 SUM 函数返回 NULL 时有一个默认值,你可以使用 COALESCE 或 NVL 函数。 使用 COALESCE 函数: 使用 NVL 函数: 在这两个例子中,

    2024年01月16日
    浏览(38)
  • 全网最详细解读《GIN-HOW POWERFUL ARE GRAPH NEURAL NETWORKS》!!!

    GNNs 大都遵循一个递归邻居聚合的方法,经过 k 次迭代聚合,一个节点所表征的特征向量能够捕捉到距离其 k-hop 邻域的邻居节点的特征,然后还可以通过 pooling 获取到整个图的表征(比如将所有节点的表征向量相加后用于表示一个图表征向量)。 关于邻居聚合策略以及池化策

    2024年02月05日
    浏览(46)
  • PostgreSQL(十一)coalesce() 函数的用法

    COALESCE 是 PostgreSQL 以及许多其他 SQL 数据库系统中的一种 内置函数 ,用于返回第一个非空(NOT NULL)的表达式或值。当多个字段或表达式可能为空时,它可以非常有用。 基本语法: COALESCE 函数会从左至右检查其参数列表中的每个参数,如果遇到的第一个参数不是 NULL,则返回

    2024年03月09日
    浏览(36)
  • mysql数据库运行sql:datetime(0) NULL DEFAULT NULL报错【杭州多测师_王sir】

    一、错误信息 二、解决方法 问题发现是第三行,那就是datetime字段,在网上查询是mysql版本时间字段不能设置为0。给一个默认值,直接删除 (0) NULL

    2024年02月10日
    浏览(45)
  • MySQL安装(全网最全最详细教程)

    目录 1 MySQL的卸载 1.1 停止MySQL服务 1.2 软件的卸载 2 MySQL的下载、安装、配置 2.1 MySQL的4大版本  2.2 软件的下载 2.3 软件的安装 ​2.4 软件的配置 3 多版本mysql同时安装 4 安装过程中可能会出现的问题      有些人希望卸载老版本的MySQL,安装新版本的MySQL,所以在讲如何安装之

    2024年02月09日
    浏览(59)
  • 一文带你吃透JSP,增删改查实战案例详细解读

    不得不说,JSP 现在已经是一门十分老旧的技术了,学习编程时,不仅要学习优秀的前言技术,还要对基础有一定的把握,所以学习 JSP 时,我们只做了解,不用刨根问底花费大量的时间,得不偿失。 我们主要从以下几个方面学习 JSP 技术: 理解 JSP 及其原理 学会使用 EL 表达

    2024年02月03日
    浏览(49)
  • docker 安装 mysql5.7(全网最详细)

    安装,以MySql5.7版本为例子。 docker默认的仓库比较慢,可以参考以下文章 第五标题 设置阿里云镜像仓库。 docker (简介、dcoker详细安装步骤、容器常用命令)一站打包- day01-CSDN博客 一、拉去mysql镜像 如下安装完成   查看本地镜像仓库拉去好的mysql,确认版本号 如下:  二、

    2024年04月10日
    浏览(53)
  • 如何进行JMeter分布式压测?一个案例教你详细解读!

    目录 引言 一、什么是压力测试? 二、什么是分布式测试? 三、为什么要使用分布式压力测试? 四、主流压力测试工具对比 五、Jmeter分布式压测原理 六、Jmeter分布式压测前的准备工作 七、阿里云服务器上进行分布式压测 八、系统架构学习 当前快速发展的互联网应用领域,

    2024年02月08日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包