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

news2024/11/14 6:35:03

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,也不会影响其他条件的判断,从而实现了动态条件的查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1915053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java中stirng真的不可改变么?

目录 1. 字符数组的私有性和不可变性 2. 没有提供修改内容的方法 3. 共享字符串常量池 4.不可变性的优点 5.结论 🎈边走、边悟🎈迟早会好 Java 中的 String 对象是不可变的。不可变性意味着一旦创建了一个 String 对象,它的值就不能再被…

怎么提高音频声音大小?提高音频声音大小的四种方法

怎么提高音频声音大小?在音频处理和编辑中,增加声音的音量是一个常见的需求,尤其是在确保音频清晰度和听觉效果的同时。调整音频的音量不仅仅是简单地提高音频的响度,它也涉及到如何保持音质的高标准,确保没有失真或削…

STM32智能机器人手臂控制系统教程

目录 引言环境准备智能机器人手臂控制系统基础代码实现:实现智能机器人手臂控制系统 4.1 数据采集模块 4.2 数据处理与控制算法 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:机器人手臂管理与优化问题解决方案与优化收尾与总结 1. 引言 …

计算机组成原理:408考研|王道|学习笔记II

系列目录 计算机组成原理 学习笔记I 计算机组成原理 学习笔记II 目录 系列目录第四章 指令系统4.1 指令系统4.1.1 指令格式4.1.2 扩展操作码指令格式 4.2 指令的寻址方式4.2_1 指令寻址4.2_2 数据寻址 4.3 程序的机器级代码表示4.3.1 高级语言与机器级代码之间的对应4.3.2 常用…

leetcode--从前序与中序遍历序列构造二叉树

leetcode地址:从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,…

提升机器视觉与机器学习软件安全性的实践策略

在近几年科技爆发中,机器学习(ML)和机器视觉(MV)的结合正在改变各行各业。机器学习通过数据驱动的算法让计算机能够自我学习,而机器视觉赋予计算机识别和理解图像的能力。这种结合使得计算机可以高效地执行…

传统的springboot项目中,如何进行添加自定义静态资源访问路径实现对静态资源的访问?

如何配置可以实现在浏览器中配置路径实现对resource资源路径下的index.html个性化定制访问路径 要在Spring Boot项目中配置使特定前缀访问静态资源,可以在application.yml文件中配置路径映射。以下是一个示例配置: 打开你的application.yml文件&#xf…

【MindSpore学习打卡】应用实践-LLM原理和实践-基于MindSpore实现BERT对话情绪识别

在当今的自然语言处理(NLP)领域,情绪识别是一个非常重要的应用场景。无论是在智能客服、社交媒体分析,还是在情感计算领域,准确地识别用户的情绪都能够极大地提升用户体验和系统的智能化水平。BERT(Bidirec…

C++基础篇(1)

目录 前言 1.第一个C程序 2.命名空间 2.1概念理解 2.2namespace 的价值 2.3 namespace的定义 3.命名空间的使用 4.C的输入输出 结束语 前言 本节我们将正式进入C基础的学习,话不多说,直接上货!!! 1.第一个C程…

2024.7.10作业

完成学生管理系统 1> 使用菜单完成 2> 有学生的信息录入功能:输入学生个数,并将学生的姓名、分数录入 3> 查看学生信息:输出所有学生姓名以及对应的分数 4> 求出学习最好的学生信息:求最大值 5> 按姓名将所有…

vue学习day05-watch侦听器(监视器)、Vue生命周期和生命周期的四个阶段、、工程化开发和脚手架Vue cli

13、watch侦听器(监视器) (1)作用:监视数据变化,执行一些业务逻辑或异步操作 (2)语法: 1)简写语法——简单数据类型,直接监视 ① Watch:{ 数…

python reload找不到怎么办

Python 3.0 把 reload 内置函数移到了 imp 标准库模块中。它仍然像以前一样重载文件,但是,必须导入它才能使用。 方法一: from imp import reload reload(module) 方法二: import imp imp.reload(module)

计算机网络之广域网

广域网特点: 主要提供面向通信的服务,支持用户使用计算机进行远距离的信息交换。 覆盖范围广,通信的距离远,需要考虑的因素增多, 线路的冗余、媒体带宽的利用和差错处理问题。 由电信部门或公司负责组建、管理和维护,并向全社会…

基于Booth乘法和Wallace树的乘法器优化思想

基于Booth乘法和Wallace树的快速乘法器 为了理解Booth乘法和Wallace数如何让乘法器变得更快: 先考虑不优化的8位乘法器实现,即8个16位数字累积共进行7次加法运算,可以认为一次16位加法用到16个全加器,则共需要112个全加器件&…

创建React 项目的几种方式

①.react自带脚手架 使用步骤: 1、下载 npm i create-react-app -g 2、创建项目命令: create-react-app 项目名称 ②.Vite构建工具创建react步骤:(推荐) 方法一: 1、yarn create vite 2、后续根据提示步…

深度动态IP代理 国内动态IP软件哪个好用

想必大家都用过动态IP产品,什么是动态IP,动态IP就是非固定的静态IP地址,短 时间了频繁波动ip地址,就叫动态IP,因为工作需要用到不同的IP,这时就需要动态IP软件。 今天给大家带来一款深度动态IP软件&#xf…

MySQL安全值守常用语句

一、用户权限设置 1、Mysql中用户是如何定义的 用户名主机域 10.0.0.5110.0.0.%%10.0.0.0/255.255.255.0Db01Localhost127.0.0.1 2、用户创建 create user xinjing% identified by 123 3、用户删除 drop user username;username 是要删除的用户名:如 drop user root…

SpringBoot日常:编码规范之import *

前言 日常开发中,我们在编码过程中会经常忽略import 包的问题,我们会使用import语句中的通配符*来引入整个包中的所有类。尽管这样做能够简化代码编写和阅读,但是过度使用import *也会带来一些坏处,本文将探讨这些问题并给出相应…

在Linux下直接修改磁盘镜像文件的内容

背景 嵌入式Linux系统通常在调试稳定后,会对磁盘(SSD、NVME、SD卡、TF卡)做个镜像,通常是.img后缀的文件,以后组装新设备时,就将镜像文件烧录到新磁盘即可,非常简单。 这种方法有个不便之处&a…

前端面试题41(在JavaScript中,如何实现MVVM的数据绑定?)

在JavaScript中实现MVVM(Model-View-ViewModel)架构下的数据绑定,主要通过观察者模式、发布/订阅模式和数据劫持等技术来完成。下面我将概述几种常见的实现方式,以及如何在不使用框架的情况下手动实现数据绑定。 使用框架实现数据…