MySQL 拼接字符串的3種方式


方式一:CONTACT()

功能:將多個字符串連接成一個字符串;

語法:concat(str1, str2,...);

說明:返回結果為連接參數產生的字符串,如果有任何一個參數為null,則返回值為null。

  示例1:

select CONCAT(DATE_FORMAT(T.VISITDATE, '%Y年%m月%d日'),'到',DATE_FORMAT(T.FOUTHOSPDATE, '%Y年%m月%d日')) 住院時間 FROM cz_fet_main_zy t
WHERE T.VISITDATE is not null and T.FOUTHOSPDATE is not null;  

  示例2:

select CONCAT(DATE_FORMAT(T.VISITDATE, '%Y年%m月%d日'),'到',DATE_FORMAT(T.FOUTHOSPDATE, '%Y年%m月%d日')) 住院時間 FROM cz_fet_main_zy t
WHERE T.VISITDATE is null or T.FOUTHOSPDATE is null;

  如果我們不想讓它的值顯示為null的話,可以使用IFNULL()函數;

select IFNULL(CONCAT(DATE_FORMAT(T.VISITDATE, '%Y年%m月%d日' ),'到',DATE_FORMAT(T.FOUTHOSPDATE, '%Y年%m月%d日')), '') 住院時間 FROM cz_fet_main_zy t
WHERE T.VISITDATE is null or T.FOUTHOSPDATE is null;

  這說明:

  在同一行數據中,字段VISITDATE和字段FOUTHOSPDATE二者的值至少其中一個的值為null。

方式二:CONTACT_WS()

功能:和concat()一樣,將多個字符串連接成一個字符串,但是可以一次性指定分隔符(concat_ws就是concat with separator的縮寫)

語法:concat_ws(separator,str1,str2,...)

說明:

第一個參數指定分隔符;

需要注意的是分隔符不能為null,如果為null,則返回結果為null。

select CONCAT_WS('到',DATE_FORMAT(T.VISITDATE, '%Y年%m月%d日' ),DATE_FORMAT(T.FOUTHOSPDATE, '%Y年%m月%d日')) 住院時間 FROM cz_fet_main_zy t
WHERE T.VISITDATE is null or T.FOUTHOSPDATE is null;

  和上面的查詢語句,除了使用的函數不一樣外,沒有任何區別,但為什么拼接結果不一樣呢? 

  這是說明:

  在同一行數據中,字段VISITDATE和字段FOUTHOSPDATE二者的值有且只有其中一個的值為null。

  下面我們來證明一下:

  小結:

  contact()的適用情況:

  在確定兩個字段都有值且不需要拼接符的情況;

  當其中一個字段的值為null且要求拼接結果為null時;

  contact_ws()的適用情況:

  其中一個字段的值為null,另一個字段的值不為null且要求拼接結果必須有值時;

  需要拼接符,且不允許當參數存在null,拼接結果不能為null時;

  以我上面使用的例子進行說明:

  住院時間,是一個時間段;

  當兩個字段都有值時,才允許頁面進行展示;

  當只有其中一個字段有值時,不允許頁頁面展示;

  這樣一來,只有contact()能滿足我的需求。

方式三:GROUP_CONCAT()

功能:將group by產生的同一個分組中的值連接起來,返回一個字符串結果

語法:group_concat( [distinct] 要連接的字段 [order by 排序字段 asc/desc  ] [separator '分隔符'] )

說明:

通過使用distinct可以排除重復值;

如果希望對結果中的值進行排序,可以使用order by子句;

separator是一個字符串值,缺省為一個逗號。

  示例1:

select DATE_FORMAT(T.VISITDATE, '%Y年%m月%d日' ) 入院時間, GROUP_CONCAT(ID) 主鍵統計 FROM cz_fet_main_zy t
WHERE T.VISITDATE is null or T.FOUTHOSPDATE is null GROUP BY T.VISITDATE;

  實現的效果是:

  按照入院時間進行分組,並對該組中所有的ID進行統計窮舉,ID之間使用逗號隔開;

  示例2:

  將上面的id號從大到小排序,且用'_'作為分隔符。

select DATE_FORMAT(T.VISITDATE, '%Y年%m月%d日' ) 入院時間, GROUP_CONCAT(ID order by id desc separator '_') 主鍵統計 FROM cz_fet_main_zy t
WHERE T.VISITDATE is null or T.FOUTHOSPDATE is null GROUP BY T.VISITDATE

  示例3:

  查詢以入院時間分組的所有組的主鍵和患者類型

select DATE_FORMAT(T.VISITDATE, '%Y年%m月%d日' ) 入院時間, GROUP_CONCAT(CONCAT_WS(':',ID,PATIENTTYPE)) 主鍵HE患者類型 FROM cz_fet_main_zy t
WHERE T.VISITDATE is null or T.FOUTHOSPDATE is null GROUP BY T.VISITDATE;

 

補充說明:

  IFNULL(expr1,expr2)

  參數expr1和expr2可以是具體值,也可以是函數;

  不管是expr1還是expr2最終返回必須是一個具體的值。

  說明:如果 expr1 不是 NULL,IFNULL() 返回 expr1代表的值,否則它返回 expr2代表的值。

  可以這樣理解:

  參數1的值如果為空,則返回參數2;否則返回參數1本身。

  示例1:

SELECT IFNULL(PREPAYAMOUNT,0) PREPAYAMOUNT from cz_fet_main_mz t limit 1;

  如果字段prepayment的值為null,則用0代替。

  示例2:

select IFNULL(CONCAT(DATE_FORMAT(T.VISITDATE, '%Y年%m月%d日'),'到',DATE_FORMAT(T.FOUTHOSPDATE, '%Y年%m月%d日')), '') 住院時間 FROM cz_fet_main_zy t
WHERE T.VISITDATE is null or T.FOUTHOSPDATE is null;

  如果函數的結果為null,則用空字符''替代。

  示例3:

select IFNULL(IF(T.PATIENTTYPE = 0,'自費', (SELECT NAME FROM CZ_DIC_INFO WHERE CODE = T.MEDICALINSURANCETYPE)), '') 醫保類型 FROM cz_fet_main_zy t limit 1

  如果表達式的結果為null,則用空字符''替代。

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM