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,则用空字符''替代。
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/14991267.html