【无标题】mysql一个搜索框多个字段模糊查询

一、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

结果:
在这里插入图片描述


版权声明:本文为weixin_45618990原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。