MySQL中CONCAT()函數(shù)出現(xiàn)值為空的問題及解決辦法
項目中用到了三個字段,需要對它們用concat() 函數(shù)進行拼接以及分組group by,下面一鍋端了concat()的這個函數(shù),有concat()、concat_ws()和 group_concat() 字段拼接的用法,我們來自己造點數(shù)據(jù),做個測試。
一、concat()
1、準(zhǔn)備一張test_concat表
CREATE TABLE `test_concat` ( `id` int(11) NOT NULL, `name` varchar(25) default NULL, `age` int(5) default NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、插入一些數(shù)據(jù)
INSERT INTO test_concat (id, NAME, age) VALUES (1, 'andy', 18), (1, 'bob', 20), (2, 'jack', 33), (2, NULL, 22), (3, 'riemann', 28), (3, 'riemann', 28), (1, 'bob', 20)
3、執(zhí)行sql
SELECT * FROM test_concat;

SELECT CONCAT(id,name,age) FROM test_concat;

出現(xiàn)了null值。。。
4、解決方式
SELECT CONCAT(id,IFNULL(name,''),age) FROM test_concat;

要是name字段的值是空字符串會怎么樣呢?
繼續(xù)往下看
這時候插入的時候換成了空字符串 ' '
INSERT INTO test_concat (id, NAME, age)
VALUES
(1, 'andy', 18),
(1, 'bob', 20),
(2, 'jack', 33),
(2, '', 22),
(3, 'riemann', 28),
(3, 'riemann', 28),
(1, 'bob', 20)

沒有顯示null,而是顯示一片空白。
SELECT CONCAT(id,IFNULL(name,''),age) FROM test_concat; SELECT CONCAT(id, CASE WHEN name = '' or name is NULL THEN '' ELSE name END, age) FROM test_concat;
其實這兩種方法都可以,第二種更嚴(yán)謹(jǐn)一些。
二、concat_ws()
使用函數(shù)CONCAT_WS()。使用語法為:CONCAT_WS(separator,str1,str2,…)
CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。
第一個參數(shù)是其它參數(shù)的分隔符。分隔符的位置放在要連接的兩個字符串之間。分隔符可以是一個字符串,也可以是其它參數(shù)。如果分隔符為 NULL,則結(jié)果為 NULL。函數(shù)會忽略任何分隔符參數(shù)后的 NULL 值。但是CONCAT_WS()不會忽略任何空字符串。 (然而會忽略所有的 NULL)。
SELECT CONCAT_WS('-',id,name,age) FROM test_concat;

直接不需要判斷為不為空,這種方式不會出現(xiàn)null值的情況!
三、group_concat()
GROUP_CONCAT([DISTINCT] expr [,expr …]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] [,col …]]
[SEPARATOR str_val])
在 MySQL 中,你可以得到表達式結(jié)合體的連結(jié)值。通過使用 DISTINCT 可以排除重復(fù)值。如果希望對結(jié)果中的值進行排序,可以使用 ORDER BY 子句。
SEPARATOR 是一個字符串值,它被用于插入到結(jié)果值中。缺省為一個逗號 (","),可以通過指定 SEPARATOR “” 完全地移除這個分隔符。
可以通過變量 group_concat_max_len 設(shè)置一個最大的長度。在運行時執(zhí)行的句法如下: SET [SESSION | GLOBAL] group_concat_max_len = unsigned_integer;
如果最大長度被設(shè)置,結(jié)果值被剪切到這個最大長度。如果分組的字符過長,可以對系統(tǒng)參數(shù)進行設(shè)置:SET @@global.group_concat_max_len=40000;
使用示例:
SELECT id, GROUP_CONCAT(name) FROM test_concat WHERE id in('1', '2') GROUP BY id;

SELECT id, GROUP_CONCAT(distinct name ORDER BY name DESC SEPARATOR '_') FROM test_concat WHERE id in('1', '2') GROUP BY id;

SELECT id, GROUP_CONCAT(CONCAT_WS(', ',name,age) ORDER BY name DESC SEPARATOR '. ') FROM test_concat WHERE id in('1', '2') GROUP BY id;

到此這篇關(guān)于MySQL中CONCAT()函數(shù)出現(xiàn)值為空的問題及解決辦法的文章就介紹到這了,更多相關(guān)MySQL CONCAT()空值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL基于group_concat()函數(shù)合并多行數(shù)據(jù)
- MySQL中組合字段之concat()
- Mybatis?mysql模糊查詢方式(CONCAT多個字段)及bug
- MySQL中CONCAT和GROUP_CONCAT方法的區(qū)別詳解
- mysql 模糊查詢 concat()的用法詳解
- Mysql中的concat函數(shù)(拼接函數(shù))詳解
- MySQL group_concat函數(shù)使用方法詳解
- mysql中的concat()函數(shù)模糊查詢代替${}問題
- mysql中GROUP_CONCAT函數(shù)使用及遇到問題詳解
- mysql中GROUP_CONCAT函數(shù)使用技巧及問題詳解
- MySQL中的CONCAT()函數(shù):輕松拼接字符串的利器
相關(guān)文章
mysql?復(fù)制行數(shù)據(jù)命令經(jīng)驗分享(Mysql?復(fù)制一條數(shù)據(jù))
有時候表里有一行已經(jīng)添加好的數(shù)據(jù),想要多復(fù)制幾百條用來測試比如要分頁測試等,需要多條數(shù)據(jù),但是有時候數(shù)據(jù)表字段太多了,有幾十個,一個一個手寫那是不可能的2023-09-09
MySQL備份與恢復(fù)之保證數(shù)據(jù)一致性(5)
這篇文章主要介紹了MySQL備份與恢復(fù)之保證數(shù)據(jù)一致性,感興趣的小伙伴們可以參考一下2015-08-08
Mysql數(shù)據(jù)庫中的redo?log?寫入策略和binlog?寫入策略
這篇文章主要介紹了Mysql?redo?log?寫入策略和binlog?寫入策略,通過本文學(xué)習(xí)可以了解redo?log的寫入策略是由InnoDB提供了innodb_flush_log_at_trx_commit參數(shù),binlog的寫入策略,write?和fsync的時機,是由參數(shù)sync_binlog控制的,需要的朋友可以參考下2022-04-04
MySQL觸發(fā)器之判斷更新操作前后數(shù)據(jù)是否改變
這篇文章主要介紹了MySQL觸發(fā)器之判斷更新操作前后數(shù)據(jù)是否改變方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08

