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

MySQL中的字符串处理函数:concat 函数

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

相关推荐
TDengine (老段)17 小时前
TDengine Python 连接器入门指南
大数据·数据库·python·物联网·时序数据库·tdengine·涛思数据
萧曵 丶17 小时前
事务ACID特性详解
数据库·事务·acid
kejiayuan18 小时前
CTE更易懂的SQL风格
数据库·sql
kaico201818 小时前
MySQL的索引
数据库·mysql
清水白石00819 小时前
解构异步编程的两种哲学:从 asyncio 到 Trio,理解 Nursery 的魔力
运维·服务器·数据库·python
资生算法程序员_畅想家_剑魔19 小时前
Mysql常见报错解决分享-01-Invalid escape character in string.
数据库·mysql
PyHaVolask19 小时前
SQL注入漏洞原理
数据库·sql
ptc学习者19 小时前
黑格尔时代后崩解的辩证法
数据库
代码游侠20 小时前
应用——智能配电箱监控系统
linux·服务器·数据库·笔记·算法·sqlite
!chen20 小时前
EF Core自定义映射PostgreSQL原生函数
数据库·postgresql