如何解决where name like '%%' 当name 为null时,查询不到数据?
我的情景是前台会传入2个查询的条件,如果不输入的话就是
where name like'%%' and method like '%%'
这个时候我想数据库查询的时候把所有的都查询出来(包括null),但是上面的语句是不能查询null的,null的是xxx is null;
如果都有输入的话就是where name like'%xx%' and method like '%xx%'
,这个是没有问题的,那么我怎么把这两种情况结合起来写呢(细分的话可能不止这两种情况,2个查询条件可以是一个有条件一个没条件,都有条件亦或是都没有条件,3种?)
我上网查了一下,有2中解决方案
1)当like不为空时才加滤条件
2) where isnull(name,case when '查询变量'=='0' then 1 else '0' end)
第一种比较好理解,在java后台改,可我的改动会比较大,第二种我不太理解,看样子是改写sql语句,我想用第二种,我的sql语句该怎么改??拜谢~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
SELECT
FROM
WHERE
AND NAME LIKE concat(
写了一个name的排查,另外一个你自己看嘛,应该不是最好的解决方案
可以在业务逻辑里写,不一定非得在sql
不知道有没有使用数据库框架,如果用到的话一般都有相应的解决方法。
比如mybatis的话可以使用 iftest 判断是否需要执行like语句。
还有一种方法是利用数据库本身的函数 比如 IF(expr1,expr2,expr3) 或者IF ELSE之类的
如果前台没有输入参数,为什么要查询该字段的结果呢?这不是不符合业务逻辑?
where IFNULL(name, '') like'%xx%' and IFNULL(method, '') like '%xx%'
如果
name
为null
将其转换为empty string
那%%
就能匹配上了。不过我认为最好的做法还是使用
SQL
的地方增加逻辑判断会比较好一些,改动量应该非常少,只需要几句代码就搞定了。题主可以看看@家常菜 的SQL增加一个where 1=1
的条件,那if
条件增加条件就会非常容易了。最好是写在业务逻辑层(这层本来就是干这个的),这种事情不要到数据库层再处理,这样很不合理也很没有效率。
简单的办法,把表中值null转为''
where ifnull(name,'') like'%%' and ifnull(method,'') like '%%'
不考虑效率的话这样就可以了
题主是想简单地把界面上的查询条件拼接为SQL语句的Where条件,这样在程序处理上确实很方便,不过出于安全考虑,最好不要这么做啦,因为有SQL注入的风险。
如果是内部应用,环境确实很安全,考虑到性能,也还是建议在拼接SQL的代码逻辑上处理一下,没有这个参数就不要拼对应的where子句,比如如果是Java,可以写成:
*这里是假设:
nameStr和methodStr分别是从界面上获取的用户输入内容,如果用户没有输入,得到的是空字符串,而不是null
xxxxxx是其他的where条件,如果真的其他条件都没有,那还需要处理一下“where ”字符串本身*
如果 数据库默认值就是 null ,或者,当获取到值为 null 时,修改为 nu。。
where name='' or method ='' or name like'%%' and method like '%%'
为什么不能再执行SQL语句前判断一下两个查询变量呢?
伪代码如下:
从效率的角度,强烈建义,name或method为空时,就不把该值作为查询条件
比如name 为空直接
where method like '%xxx%'