mysql中CONCAT()函數(shù)結(jié)果為null的問題解決
背景 :發(fā)現(xiàn)數(shù)據(jù)漏更新,排查時候看代碼一直沒問題,因?yàn)榭吹皆诖a里用了 Optional.ofNullable(value).orElse(''),不該漏掉,后來發(fā)現(xiàn)在sql里面查詢的時候不是用的代碼里已拼好的字符串,而是用concat()又拼了一遍,所以其中任一字符串為null的數(shù)據(jù)都沒查到。
在 SQL 中使用 CONCAT(str1, str2)
時,如果 str1
或 str2
為 NULL
或空串(''
)會發(fā)生什么
1、SQL 中CONCAT()函數(shù)的行為(以 MySQL 為例)
規(guī)則總結(jié):
情況 | 結(jié)果 | 說明 |
---|---|---|
CONCAT('hello', 'world') | 'helloworld' | 正常拼接 |
CONCAT('hello', '') | 'hello' | 空串不影響 |
CONCAT('hello', NULL) | NULL | 只要有一個是 NULL,結(jié)果就是 NULL ? |
CONCAT(NULL, 'world') | NULL | 同上 |
CONCAT(NULL, NULL) | NULL | 同上 |
?? 在標(biāo)準(zhǔn) SQL 和 MySQL 中,CONCAT(NULL, ...) 的結(jié)果是 NULL。
2、CONCAT()的其他相關(guān)使用場景
- 模糊查詢
CONCAT('%', #{device}, '%')
- 路徑匹配
--判斷某個字段是否“以 `prefix` 開頭,并且 `prefix` 后面是 `/` 或字符串結(jié)尾 REGEXP CONCAT('^', #{prefix}, '(/|$)')
3、如何避免出現(xiàn)null,導(dǎo)致漏查漏改數(shù)據(jù)
-- 1.使用 COALESCE:將 NULL 轉(zhuǎn)為空串 SELECT CONCAT(COALESCE(str1, ''), COALESCE(str2, '')) AS result FROM your_table; -- 2.使用 IFNULL:將 NULL 轉(zhuǎn)為空串 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'
到此這篇關(guān)于mysql中CONCAT()函數(shù)結(jié)果為null的問題解決的文章就介紹到這了,更多相關(guān)mysql中CONCAT()結(jié)果為null內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sql中替換函數(shù)replace()用法與實(shí)例總結(jié)
這篇文章主要給大家介紹了關(guān)于sql中替換函數(shù)replace()用法與實(shí)例的相關(guān)資料,在SQL中REPLACE函數(shù)用于替換一個字符串中的一部分為另一個字符串,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02為mysql數(shù)據(jù)庫添加添加事務(wù)處理的方法
開始首先說明一下,mysql數(shù)據(jù)庫默認(rèn)的數(shù)據(jù)庫引擎是MyISAM,是不支持事務(wù)的,單數(shù)如果你添加了數(shù)據(jù)執(zhí)行語句是不會出錯的,單數(shù)不管用,即便是回滾事務(wù),記錄也是插入進(jìn)去了,所有首先我們要做的第一步是更改數(shù)據(jù)庫引擎2011-07-07MySQL 字符串拆分實(shí)例(無分隔符的字符串截取)
這篇文章主要介紹了MySQL 字符串拆分實(shí)例(無分隔符的字符串截取),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02Mysql 5.7.18 解壓版下載安裝及啟動mysql服務(wù)的圖文詳解
這篇文章主要介紹了Mysql 5.7.18 解壓版下載安裝及啟動mysql服務(wù)的圖文詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-05-05