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 NOT ISNULL( T.FOUTHOSPDATE );

  示例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
	! ISNULL( T.VISITDATE ) 
	AND T.FOUTHOSPDATE IS NOT 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的值如果为null,则返回参数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,则用空字符''替代。

写在最后

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

 相关推荐:

posted @ 2021-07-09 17:34  Marydon  阅读(28303)  评论(0编辑  收藏  举报