Heim  >  Fragen und Antworten  >  Hauptteil

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

PHP中文网PHP中文网2766 Tage vor1776

Antworte allen(12)Ich werde antworten

  • 巴扎黑

    巴扎黑2017-04-18 10:46:56

    SELECT

    *

    FROM

    test

    WHERE

    1 = 1

    AND NAME LIKE concat(

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

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

    Antwort
    0
  • 迷茫

    迷茫2017-04-18 10:46:56

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

    Antwort
    0
  • 大家讲道理

    大家讲道理2017-04-18 10:46:56

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

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

    Antwort
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:46:56

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

    Antwort
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:46:56

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


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

    Antwort
    0
  • ringa_lee

    ringa_lee2017-04-18 10:46:56

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

    Antwort
    0
  • ringa_lee

    ringa_lee2017-04-18 10:46:56

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

    Antwort
    0
  • PHP中文网

    PHP中文网2017-04-18 10:46:56

    题主是想简单地把界面上的查询条件拼接为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 ”字符串本身*

    Antwort
    0
  • 怪我咯

    怪我咯2017-04-18 10:46:56

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

    Antwort
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:46:56

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

    Antwort
    0
  • StornierenAntwort