84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
认证0级讲师
SELECT
*
FROM
test
WHERE
1 = 1
AND NAME LIKE concat(
'%', ( CASE WHEN NAME(传进来的name) IS NULL THEN '#################'(数据库name不可能的值) ELSE NAME(传进来的name) END ), '%')
写了一个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那%%就能匹配上了。
where IFNULL(name, '') like'%xx%' and IFNULL(method, '') like '%xx%'
name
null
empty string
%%
不过我认为最好的做法还是使用SQL的地方增加逻辑判断会比较好一些,改动量应该非常少,只需要几句代码就搞定了。题主可以看看@家常菜 的SQL增加一个where 1=1的条件,那if条件增加条件就会非常容易了。
SQL
where 1=1
if
最好是写在业务逻辑层(这层本来就是干这个的),这种事情不要到数据库层再处理,这样很不合理也很没有效率。
简单的办法,把表中值null转为''where ifnull(name,'') like'%%' and ifnull(method,'') like '%%'不考虑效率的话这样就可以了
where ifnull(name,'') like'%%' and ifnull(method,'') like '%%'
题主是想简单地把界面上的查询条件拼接为SQL语句的Where条件,这样在程序处理上确实很方便,不过出于安全考虑,最好不要这么做啦,因为有SQL注入的风险。
如果是内部应用,环境确实很安全,考虑到性能,也还是建议在拼接SQL的代码逻辑上处理一下,没有这个参数就不要拼对应的where子句,比如如果是Java,可以写成:
String whereClause = "where xxxxxx" +("".equals(nameStr) ? "" : "name like '%"+nameStr+"%'") +("".equals(methodStr) ? "" : "method like '%"+methodStr+"%'")
*这里是假设:
nameStr和methodStr分别是从界面上获取的用户输入内容,如果用户没有输入,得到的是空字符串,而不是null
xxxxxx是其他的where条件,如果真的其他条件都没有,那还需要处理一下“where ”字符串本身*
如果 数据库默认值就是 null ,或者,当获取到值为 null 时,修改为 nu。。
where name='' or method ='' or name like'%%' and method like '%%'
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 '%%'