一、or
一、CONCAT()
SELECT
COUNT(id) AS total,
SUM(CASE WHEN affirm_park = 1 THEN 1 ELSE 0 END) AS affirmPark,
SUM(CASE WHEN park_tag IS NOT NULL THEN 1 ELSE 0 END) AS startPark,
IFNULL( CAST(SUM(AREA) AS DECIMAL(18,2) ), 0) AS AREA,
IFNULL( CAST(SUM(building_area) AS DECIMAL(18,2) ), 0) AS buildingArea,
IFNULL( CAST(SUM(exist_building_area) AS DECIMAL(18,2) ), 0) AS existBuildingArea,
IFNULL( CAST(SUM(common_facilities) AS DECIMAL(18,2) ), 0) AS commonFacilities
FROM t_park
WHERE delete_type = 1
<if test="areaName != null and areaName != ''">
AND CONCAT( IFNULL(province,''),IFNULL(city,''),IFNULL(county,''),IFNULL(street,''))
LIKE CONCAT ('%', #{areaName},'%')
</if>
其中CONCAT( IFNULL(province,''),IFNULL(city,''),IFNULL(county,''),IFNULL(street,'')) LIKE CONCAT ('%', #{areaName},'%') 这个部分就是针对province,city,county,street四个字段进行模糊查询
注意:
1.如果province,city,county,street中任意一个属性的所有数据为null时(比如province字段的所有值均未赋值,默认值为null),即使另一个中包含查询的数据,也查询不到数据。
2.SUM(AREA) AS DECIMAL(18,2) 该函数指的是在 double类型下叠加时,保留2位小数。
相关解决办法:
- 1.给可能为null的查询字段设置默认值,空字符串或者其他;
- 2.改用or连接多个模糊查询
三、CONCAT()与 CONCAT_WS()区别
CONCAT():
意义:函数可以连接一个或者多个字符串。
CONCAT(str1,str2,…)返回结果为所有连接参数产生的一个字符串。如
有任何一个参数为NULL ,则返回值NULL。
示例:select concat(‘aa’,‘bb’,‘cc’);
结果:aabbcc
CONCAT_WS():
意义:是concat()的特殊形式。
CONCAT_WS(separator,str1,str2,...)第一个参数是其它参数连接的分隔符。分隔符是放在要连接的所有字符串之间。分隔符可以是一个字符串,也可以是其它参数。
不会因为NULL值而返回NULL。
CONCAT_WS 会自动判断查询出来的值是否为null 如果是null则忽略为null值的拼接 继续拼接有值的
示例:select concat_ws(’,’,‘aa’,‘bb’,‘cc’);
结果:aa,bb,cc
注意:
如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。
group_concat ():
roup_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])
用例:group_concat 使用场景:以id分组,将id相同的name值都打印在一行
mysql> select id,group_concat(name) from aa group by id;
+------+--------------------+
| id| group_concat(name) |
+------+--------------------+
|1 | 10,20,20|
|2 | 20 |
|3 | 200,500|
+------+--------------------+
3 rows in set (0.00 sec)
扩展:
CONCAT_WS、group_concat 联合使用场景:
例:以考试分组,查询每个考试下的所有最高分用户的id和name,并将用户id和name用"||“分隔,用户之间用”,"分隔
SELECT
thh.exam_id as examId,
thh.score,
GROUP_CONCAT(CONCAT_WS('||',thh.USER_ID, thh.USER_NAME)) maxUsers
FROM exam_history thh
WHERE thh.score=100
GROUP BY thh.exam_id
结果: