认证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。 。
其中 name='' 或 method ='' 或名稱如 '%%' 且方法如 '%%'
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。 。
其中 name='' 或 method ='' 或名稱如 '%%' 且方法如 '%%'