如何解决where name like '%%' 当name 为null时,查询不到数据?

发布于 2022-09-04 13:17:36 字数 634 浏览 37 评论 0

图片描述
我的情景是前台会传入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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(12

記柔刀 2022-09-11 13:17:37

SELECT

*

FROM

test

WHERE

1 = 1

AND NAME LIKE concat(

'%',
(
    CASE
    WHEN NAME(传进来的name) IS NULL THEN
        '#################'(数据库name不可能的值)
    ELSE
        NAME(传进来的name)
    END
),
'%')

写了一个name的排查,另外一个你自己看嘛,应该不是最好的解决方案

月光色 2022-09-11 13:17:37

可以在业务逻辑里写,不一定非得在sql

童话 2022-09-11 13:17:37

不知道有没有使用数据库框架,如果用到的话一般都有相应的解决方法。
比如mybatis的话可以使用 iftest 判断是否需要执行like语句。

还有一种方法是利用数据库本身的函数 比如 IF(expr1,expr2,expr3) 或者IF ELSE之类的

桜花祭 2022-09-11 13:17:37

如果前台没有输入参数,为什么要查询该字段的结果呢?这不是不符合业务逻辑?

沩ん囻菔务 2022-09-11 13:17:37

where IFNULL(name, '') like'%xx%' and IFNULL(method, '') like '%xx%'
如果namenull将其转换为empty string%%就能匹配上了。


不过我认为最好的做法还是使用SQL的地方增加逻辑判断会比较好一些,改动量应该非常少,只需要几句代码就搞定了。题主可以看看@家常菜 的SQL增加一个where 1=1的条件,那if条件增加条件就会非常容易了。

所有深爱都是秘密 2022-09-11 13:17:37

最好是写在业务逻辑层(这层本来就是干这个的),这种事情不要到数据库层再处理,这样很不合理也很没有效率。

南风几经秋 2022-09-11 13:17:37

简单的办法,把表中值null转为''
where ifnull(name,'') like'%%' and ifnull(method,'') like '%%'
不考虑效率的话这样就可以了

倾城泪 2022-09-11 13:17:37

题主是想简单地把界面上的查询条件拼接为SQL语句的Where条件,这样在程序处理上确实很方便,不过出于安全考虑,最好不要这么做啦,因为有SQL注入的风险。

如果是内部应用,环境确实很安全,考虑到性能,也还是建议在拼接SQL的代码逻辑上处理一下,没有这个参数就不要拼对应的where子句,比如如果是Java,可以写成:

String whereClause = "where xxxxxx"
                     +("".equals(nameStr) ? "" : "name like '%"+nameStr+"%'")
                     +("".equals(methodStr) ? "" : "method like '%"+methodStr+"%'")

*这里是假设:

  1. nameStr和methodStr分别是从界面上获取的用户输入内容,如果用户没有输入,得到的是空字符串,而不是null

  2. xxxxxx是其他的where条件,如果真的其他条件都没有,那还需要处理一下“where ”字符串本身*

情话已封尘 2022-09-11 13:17:37

如果 数据库默认值就是 null ,或者,当获取到值为 null 时,修改为 nu。。

七秒鱼° 2022-09-11 13:17:37

where name='' or method ='' or name like'%%' and method like '%%'

゛时过境迁 2022-09-11 13:17:37

为什么不能再执行SQL语句前判断一下两个查询变量呢?

伪代码如下:

if (isNull(a)) {
    a = '';
}

if (isNull(b)) {
    b = '';
}
薄荷港 2022-09-11 13:17:37

从效率的角度,强烈建义,name或method为空时,就不把该值作为查询条件
比如name 为空直接
where method like '%xxx%'

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文