一、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,也不会影响其他条件的判断,从而实现了动态条件的查询。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |