当前位置: 首页 > news >正文

【SQL】MySQL中的字符串处理函数:concat 函数拼接字符串,COALESCE函数处理NULL字符串

MySQL中的字符串处理函数:concat 函数
    • 一、concat ()函数
      • 1.1、基本语法
      • 1.2、示例
      • 1.3、特殊用途
    • 二、COALESCE()函数
      • 2.1、基本语法
      • 2.2、示例
      • 2.3、用途
    • 三、进阶练习
      • 3.1 条件和 SQL 语句
      • 3.2、解释

一、concat ()函数

MySQL的 CONCAT 函数是一个非常实用的字符串函数,用于将两个或多个字符串参数连接成一个单一的字符串。如果任何一个参数为 NULL,则 CONCAT 函数的结果也会是 NULL。这一点在构建包含潜在NULL值的数据库查询时特别重要,因为它可能影响到你的查询结果。

1.1、基本语法
CONCAT(string1, string2, ..., stringN)

参数
string1, string2, …, stringN:这些是要连接的字符串。你可以连接任意数量的字符串。

1.2、示例

假设有一个数据库表 users,其中包含 first_namelast_name 两个字段,下面的例子展示了如何使用 CONCAT 来生成一个完整的姓名:

SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;

这将把 first_namelast_name 通过一个空格连接起来,形成一个 full_name

1.3、特殊用途
  • LIKE 操作符结合使用:在需要进行模糊匹配的搜索查询中,CONCAT 可以用来包围搜索关键字,以实现任意位置的模糊匹配。

    SELECT * FROM products WHERE name LIKE CONCAT('%', 'apple', '%');
    

    这个查询会返回所有产品名称中包含 "apple" 的记录。

  • 处理可能的 NULL 值:由于 CONCAT 会在任何参数为 NULL 时返回 NULL ,在使用前确保参数不为 NULL 或使用 COALESCE 来提供默认值是一种常见的做法。

    SELECT CONCAT(COALESCE(first_name, ''), ' ', COALESCE(last_name, '')) AS full_name FROM users;
    

    这样即使 first_namelast_nameNULL ,也可以避免整个结果变成 NULL

    CONCAT 是处理数据库中字符串操作时非常基础且有用的工具,它使得从多个列组合数据变得简单直接。

二、COALESCE()函数

COALESCE() 函数用于从一组参数中返回第一个非空(非 NULL)的值。如果所有参数都为 NULL,则 COALESCE() 返回 NULL

2.1、基本语法
COALESCE(value1, value2, ..., valueN)

value1, value2, ..., valueN:要检查的参数列表。可以有多个参数,如果第一个参数不为空,则返回第一个参数的值;如果第一个参数为空,则继续检查第二个参数,以此类推。

2.2、示例
SELECT COALESCE(NULL, 'Value', 123); -- 返回 'Value'
SELECT COALESCE(NULL, NULL, NULL, 123); -- 返回 123
SELECT COALESCE(NULL, NULL); -- 返回 NULL

在这些示例中,COALESCE() 函数总是返回第一个非空参数的值。如果所有参数都为空,则返回 NULL

2.3、用途
  • 处理可能的NULL值:在数据处理和查询中,经常需要处理可能为 NULL 的情况,COALESCE() 函数可以帮助简化这种处理,使得代码更加清晰和健壮。
  • 在之前的SQL查询中,COALESCE() 函数的作用是将可能为 NULL 的搜索关键词参数转换为空字符串,以便在查询中进行模糊匹配或者不影响其他条件的判断。

三、进阶练习

3.1 条件和 SQL 语句

下面这段SQL查询是 mybatis 中用于从数据库中查询符合特定条件的文章数据。
在这里插入图片描述

具体来说,它查询的是blog_post表和users表的联合结果,条件包括:

  • 内容搜索词(contentKeyword):如果提供了内容搜索词,将会检查文章的标题和内容是否包含该关键词的子串。

  • 用户搜索词(userKeyword):如果提供了用户搜索词,将会检查文章的作者用户名是否包含该关键词的子串。

  • 类别ID(categoryId):如果提供了类别ID,将会检查文章的类别ID是否匹配指定的ID。

  • 用户ID(userId):如果提供了用户ID,将会检查文章的作者用户ID是否匹配指定的ID。

    SELECT bp.*
    FROM blog_post bp
    JOIN users u ON bp.user_id = u.user_id
    WHERE
    (COALESCE(:contentKeyword, ‘’) = ‘’ OR bp.title LIKE CONCAT(‘%’, :contentKeyword, ‘%’) OR bp.content LIKE CONCAT(‘%’, :contentKeyword, ‘%’))
    AND (COALESCE(:userKeyword, ‘’) = ‘’ OR u.username LIKE CONCAT(‘%’, :userKeyword, ‘%’))
    AND (COALESCE(:categoryId, 0) = 0 OR bp.category_id = :categoryId)
    AND (COALESCE(:userId, 0) = 0 OR bp.user_id = :userId);

3.2、解释
  • 参数说明:

    • :contentKeyword — 内容搜索词,用于匹配 titlecontent 字段。
    • :userKeyword — 用户搜索词,用于匹配 username 字段。
    • :categoryId — 类别ID,用于匹配 category_id 字段。
    • :userId — 用户ID,用于匹配 user_id 字段。
  • 详细解释:
    这是一个动态查询示例,其中使用了 COALESCE 函数来处理可能为 NULL 的参数。下面我会解释每个条件是如何工作的:

    • 内容搜索

      (COALESCE(:contentKeyword, '') = '' OR bp.title LIKE CONCAT('%', :contentKeyword, '%') 
      OR bp.content LIKE CONCAT('%', :contentKeyword, '%'))
      

      这个条件是用来处理内容搜索词的。如果contentKeyword参数为NULL,那么就返回空字符串,然后检查bp.title或bp.content是否包含该关键词的子串。如果contentKeyword不为NULL,则直接检查匹配。

    • 用户名搜索

      (COALESCE(:userKeyword, '') = '' OR u.username LIKE CONCAT('%', :userKeyword, '%'))
      

      这个条件是用来处理用户搜索词的。如果 userKeyword 参数为 NULL ,则返回空字符串,然后检查u.username 是否包含该关键词的子串。如果 userKeyword 不为 NULL,则直接检查匹配。

    • 类别搜索

      (COALESCE(:categoryId, 0) = 0 OR bp.category_id = :categoryId):
      

      这个条件是用来处理类别搜索的。如果 categoryId 参数为 NULL,则返回 0 ,然后检查bp.category_id 是否等于 0 。如果 categoryId 不为 NULL,则直接检查匹配。

    • 用户 ID 搜索

      (COALESCE(:userId, 0) = 0 OR bp.user_id = :userId)
      

这个条件是用来处理用户ID搜索的。如果 userId 参数为 NULL ,则返回 0,然后检查 bp.user_id 是否等于 0。如果 userId 不为 NULL,则直接检查匹配。
这种写法确保了即使参数为 NULL,也不会影响其他条件的判断,从而实现了动态条件的查询。

相关文章:

【SQL】MySQL中的字符串处理函数:concat 函数拼接字符串,COALESCE函数处理NULL字符串

MySQL中的字符串处理函数:concat 函数 一、concat ()函数 1.1、基本语法1.2、示例1.3、特殊用途 二、COALESCE()函数 2.1、基本语法2.2、示例2.3、用途 三、进阶练习 3.1 条件和 SQL 语句3.2、解释 一、concat &…...

c++中深拷贝和浅拷贝的联系和区别

在 C 编程里,深拷贝和浅拷贝是两种不同的对象复制方式,它们在实现方式、资源管理和适用场景等方面存在显著差异。下面为你详细介绍它们的区别。 1. 基本概念 浅拷贝:浅拷贝仅仅复制对象的成员变量值。对于基本数据类型(如 int、d…...

Autotestplat 在多个平台和公司推荐使用!

1、 51Testing软件测试网 开源好用!推荐一款更轻量化的自动化测试平台! 2、程序员杨叔 从繁琐到简单!Autotestplat自动化测试平台搭建使用 3、一飞开源 [开源]一站式自动化测试平台及解决方案,支持接口、性能、UI测试 4、github h…...

字符串最后一个单词的长度

一&#xff1a;题目 二&#xff1a;思路 用rfind()函数倒着找第一个空格&#xff0c;返回的值为pos&#xff0c;然后打印size()-(pos1)&#xff0c;posnpos就代表只有一个单词&#xff0c;则直接返回size #include <iostream> using namespace std; int main() {strin…...

【Linux】learning notes(3)make、copy、move、remove

文章目录 1、mkdir &#xff08;make directory&#xff09;2、rmdir &#xff08;remove directory&#xff09;3、rm&#xff08;remove&#xff09;4、>5、touch 新建文件6、mv&#xff08;move&#xff09;7、cp&#xff08;copy&#xff09; 1、mkdir &#xff08;make…...

一、图像图像的基本概念

文章目录 一、分辨率概念二、图形图像的区别三、位图和矢量图的区别 一、分辨率概念 图形显示计数中的分辨率概念有三种&#xff0c;即屏幕分辨率、显示分辨率和显卡分辨率。它们既有区别又有着密切的联系&#xff0c;对图形显示的处理有极大的影响。 1.屏幕分辨率 显示器分辨…...

两道算法练习

力扣322零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的…...

利用 Python 爬虫进行跨境电商数据采集

1 引言2 代理IP的优势3 获取代理IP账号4 爬取实战案例---&#xff08;某电商网站爬取&#xff09;4.1 网站分析4.2 编写代码4.3 优化代码 5 总结 1 引言 在数字化时代&#xff0c;数据作为核心资源蕴含重要价值&#xff0c;网络爬虫成为企业洞察市场趋势、学术研究探索未知领域…...

设计模式--spring中用到的设计模式

一、单例模式&#xff08;Singleton Pattern&#xff09; 定义&#xff1a;确保一个类只有一个实例&#xff0c;并提供全局访问点 Spring中的应用&#xff1a;Spring默认将Bean配置为单例模式 案例&#xff1a; Component public class MySingletonBean {// Spring 默认将其…...

Qt控件中函数指针使用的最终版本,使用std::function

代码&#xff1a; class MyWidget : public QWidget { public:std::function<void(QResizeEvent* event)> pf_resizeEvent 0; protected:inline void resizeEvent(QResizeEvent* event) override {if (pf_resizeEvent ! 0)pf_resizeEvent(event);} };int main(int arg…...

Java中的泛型类 --为集合的学习做准备

学习目标 ● 掌握在集合中正确使用泛型 ● 了解泛型类、泛型接口、泛型方法 ● 了解泛型上下限 ● 了解基本的使用场景 1.有关泛型 1.1泛型的概念 泛型&#xff08;Generics&#xff09;是Java中引入的参数化类型机制&#xff0c;允许在定义类、接口或方法时使用类型参数&a…...

6.6.6 嵌入式SQL

文章目录 2个核心问题识别SQL语句主语言和SQL通信完整导图 2个核心问题 SQL语句嵌入高级语言需要解决的2个核心问题是&#xff1a;如何识别嵌入语句&#xff1f;如何让主语言&#xff08;比如C,C语言&#xff09;和SQL通信&#xff1f; 识别SQL语句 为了识别主语言中嵌入的SQL…...

基于C#的CANoe CLR Adapter开发指南

一、引言 CANoe 是一款广泛应用于汽车电子开发和测试的工具&#xff0c;它支持多种编程接口&#xff0c;方便开发者进行自定义扩展。CANoe CLR Adapter 允许我们使用 C# 语言与 CANoe 进行交互&#xff0c;充分利用 C# 的强大功能和丰富的类库。本文将详细介绍如何基于 C# 进行…...

【Qt】MVC设计模式

目录 一、搭建MVC框架 二、创建数据库连接单例类SingleDB 三、数据库业务操作类model设计 四、control层&#xff0c;关于model管理类设计 五、view层即为窗口UI类 一、搭建MVC框架 里面的bin、lib、database文件夹以及sqlite3.h与工程后缀为.pro文件的配置与上次发的文章…...

【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘

摘要 支持向量机&#xff08;SVM&#xff09;是机器学习中的经典算法&#xff01;本文将深入解析最大间隔分类原理&#xff0c;手撕对偶问题推导过程&#xff0c;并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南&#xff0c;助力你掌握这一核心算法…...

JAVA面试常见题_基础部分_Dubbo面试题(上)

Dubbo 支持哪些协议&#xff0c;每种协议的应用场景&#xff0c;优缺点&#xff1f; • dubbo&#xff1a; 单一长连接和 NIO 异步通讯&#xff0c;适合大并发小数据量的服务调用&#xff0c;以及消费者远大于提供者。传输协议 TCP&#xff0c;异步&#xff0c;Hessian 序列化…...

CSS—隐藏元素:1分钟掌握与使用隐藏元素的方法

个人博客&#xff1a;haichenyi.com。感谢关注 1. 目录 1–目录2–display:none3–visibility: hidden4–opacity: 05–position: absolute;与 left: -9999px;6–z-index 和 position7–clip-path: circle(0%) 2. display:none 标签会挂载在html中&#xff0c;但是不会在页面上…...

二、双指针——5. 移动零

二、双指针——5. 移动零 题目描述示例示例1&#xff1a;示例2&#xff1a; 思路代码 题目描述 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操…...

论文笔记-NeurIPS2017-DropoutNet

论文笔记-NeurIPS2017-DropoutNet: Addressing Cold Start in Recommender Systems DropoutNet&#xff1a;解决推荐系统中的冷启动问题摘要1.引言2.前言3.方法3.1模型架构3.2冷启动训练3.3推荐 4.实验4.1实验设置4.2在CiteULike上的实验结果4.2.1 Dropout率的影响4.2.2 实验结…...

php 对接mqtt 完整版本,订阅消息,发送消息

首先打开链接如何在 PHP 项目中使用 MQTT 根据文章让所用依赖安装一下&#xff1a; composer require php-mqtt/client 安装之后弄一个部署 之后在工具里边可以相应链接上 接下来是代码&#xff1a; /**** 订阅消息* return void* throws \PhpMqtt\Client\Exceptions\Confi…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...