方式一: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,則用空字符''替代。
