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,则用空字符''替代。

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

原文地址:https://www.cnblogs.com/Marydon20170307/p/14991267.html