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