mysql-CONCAT() 函数结果为null

44 阅读1分钟

背景 :发现数据漏更新,排查时候看代码一直没问题,因为看到在代码里用了 Optional.ofNullable(value).orElse(''),不该漏掉,后来发现在sql里面查询的时候不是用的代码里已拼好的字符串,而是用concat()又拼了一遍,所以其中任一字符串为null的数据都没查到。

SQL 中使用 CONCAT(str1, str2) 时,如果 str1str2NULL 或空串('')会发生什么

1、SQL 中 CONCAT() 函数的行为(以 MySQL 为例)

规则总结:

情况结果说明
CONCAT('hello', 'world')'helloworld'正常拼接
CONCAT('hello', '')'hello'空串不影响
CONCAT('hello', NULL)NULL只要有一个是 NULL,结果就是 NULL ❌
CONCAT(NULL, 'world')NULL同上
CONCAT(NULL, NULL)NULL同上

⚠️ 在标准 SQL 和 MySQL 中,CONCAT(NULL, ...) 的结果是 NULL

2、CONCAT()的其他相关使用场景

  • 模糊查询
CONCAT('%', #{device}, '%')
  • 路径匹配
--判断某个字段是否“以 `prefix` 开头,并且 `prefix` 后面是 `/` 或字符串结尾
REGEXP CONCAT('^', #{prefix}, '(/|$)')

3、如何避免出现null,导致漏查漏改数据

-- 1.使用 COALESCE:将 NULL 转为空串
SELECT CONCAT(COALESCE(str1, ''), COALESCE(str2, '')) AS result
FROM your_table;

-- 2.使用 IFNULL:将 NULL 转为空串
SELECT CONCAT(IFNULL(str1, ''), IFNULL(str2, '')) AS result
FROM your_table;

-- 3.使用`CONCAT_WS(separator, str1, str2, ...)` 表示“用分隔符拼接字符串”,会自动跳过 NULL 值。
SELECT CONCAT_WS('', 'hello', NULL, 'world') AS result; -- 'helloworld'