【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_name
和 last_name
两个字段,下面的例子展示了如何使用 CONCAT
来生成一个完整的姓名:
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
这将把 first_name
和 last_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_name
或last_name
为NULL
,也可以避免整个结果变成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
— 内容搜索词,用于匹配title
或content
字段。: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…...

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

【Linux】learning notes(3)make、copy、move、remove
文章目录 1、mkdir (make directory)2、rmdir (remove directory)3、rm(remove)4、>5、touch 新建文件6、mv(move)7、cp(copy) 1、mkdir (make…...
一、图像图像的基本概念
文章目录 一、分辨率概念二、图形图像的区别三、位图和矢量图的区别 一、分辨率概念 图形显示计数中的分辨率概念有三种,即屏幕分辨率、显示分辨率和显卡分辨率。它们既有区别又有着密切的联系,对图形显示的处理有极大的影响。 1.屏幕分辨率 显示器分辨…...
两道算法练习
力扣322零钱兑换 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的…...

利用 Python 爬虫进行跨境电商数据采集
1 引言2 代理IP的优势3 获取代理IP账号4 爬取实战案例---(某电商网站爬取)4.1 网站分析4.2 编写代码4.3 优化代码 5 总结 1 引言 在数字化时代,数据作为核心资源蕴含重要价值,网络爬虫成为企业洞察市场趋势、学术研究探索未知领域…...
设计模式--spring中用到的设计模式
一、单例模式(Singleton Pattern) 定义:确保一个类只有一个实例,并提供全局访问点 Spring中的应用:Spring默认将Bean配置为单例模式 案例: Component public class MySingletonBean {// Spring 默认将其…...

Qt控件中函数指针使用的最终版本,使用std::function
代码: 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泛型的概念 泛型(Generics)是Java中引入的参数化类型机制,允许在定义类、接口或方法时使用类型参数&a…...

6.6.6 嵌入式SQL
文章目录 2个核心问题识别SQL语句主语言和SQL通信完整导图 2个核心问题 SQL语句嵌入高级语言需要解决的2个核心问题是:如何识别嵌入语句?如何让主语言(比如C,C语言)和SQL通信? 识别SQL语句 为了识别主语言中嵌入的SQL…...

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

【Qt】MVC设计模式
目录 一、搭建MVC框架 二、创建数据库连接单例类SingleDB 三、数据库业务操作类model设计 四、control层,关于model管理类设计 五、view层即为窗口UI类 一、搭建MVC框架 里面的bin、lib、database文件夹以及sqlite3.h与工程后缀为.pro文件的配置与上次发的文章…...
【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘
摘要 支持向量机(SVM)是机器学习中的经典算法!本文将深入解析最大间隔分类原理,手撕对偶问题推导过程,并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南,助力你掌握这一核心算法…...

JAVA面试常见题_基础部分_Dubbo面试题(上)
Dubbo 支持哪些协议,每种协议的应用场景,优缺点? • dubbo: 单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议 TCP,异步,Hessian 序列化…...

CSS—隐藏元素:1分钟掌握与使用隐藏元素的方法
个人博客: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中,但是不会在页面上…...
二、双指针——5. 移动零
二、双指针——5. 移动零 题目描述示例示例1:示例2: 思路代码 题目描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操…...

论文笔记-NeurIPS2017-DropoutNet
论文笔记-NeurIPS2017-DropoutNet: Addressing Cold Start in Recommender Systems DropoutNet:解决推荐系统中的冷启动问题摘要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 根据文章让所用依赖安装一下: composer require php-mqtt/client 安装之后弄一个部署 之后在工具里边可以相应链接上 接下来是代码: /**** 订阅消息* return void* throws \PhpMqtt\Client\Exceptions\Confi…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...