2009-09-25 177 views
4

一起使用我需要在SQL Server中創建一個查詢,其中搜索條件將根據用戶輸入包括/排除表。將SQL LIKE運算符與%%

說我有兩個表,在TABLE_ATABLE_ATABLE_BKEYCOLUMN_A列和COLUMN_A和列FKCOLUMN_BTABLE_BCOLUMN_B

像一個查詢:

SELECT TABLE_A.* FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B 
AND TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '%SEARCH2%' 

現在,如果用戶沒有輸入SEARCH2,我並不需要搜索TABLE_B。但這意味着IF ELSE條款。隨着查詢中「可選」表的數量增加,排列和組合也會增加,並且會有許多IFELSE語句。

相反,我決定保持原樣。所以,如果SEARCH2是空的,查詢將有效地成爲:

SELECT * FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B 
AND TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '% %' 

的SQL優化器能夠認識到LIKE %%是去掉了條件本身一樣好?

+0

有第二代碼樣品中的錯字以搜索指定的模式。 %和%之間不應該有空格。 SELECT * FROM TABLE_A,TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_BAND TABLE_A.COLUMN_A LIKE'%SEARCH%'AND TABLE_B.COLUMN_B LIKE'%%' – devanalyst 2009-09-25 11:49:48

+0

使用「sql-server」標籤,如其他民間的數千... – gbn 2009-09-25 15:29:16

+0

@deanalyst:你不能編輯問題來解決這個錯誤嗎? – 2009-09-25 15:31:10

回答

9

包裝一個OR在你的「B」表,如:

AND (len(searchString)=0 OR table_b.column_b LIKE "%searchString%") 

這樣,如果該字符串沒有價值,它的長度將是零,而OR的第一部分將被評估,總是返回爲真,並將方程的那部分返回爲有效,並使用LIKE子句忽略另一半。

您可以根據需要爲相同的鏈接表應用相同的表格。

0

MySQL您也可以使用ILIKE,然後它是不區分大小寫的。

+0

這是如何回答這個問題的? – 2016-05-22 16:17:47

0

最廣泛的文章(SQL Server)的我見過的主題 是Dynamic Search Conditions in T-SQL by Erland Sommarskog

+1

它說MS SQL .... – 2009-09-25 11:31:32

+0

@米奇小麥,謝謝,但問題被編輯(由OP以外的人)包括該標籤,我回答後。 – 2009-09-25 11:40:50

2

第一件事情,你必須在你的榜樣空間:

AND TABLE_B.COLUMN_B LIKE '% %' 

,因爲它確實是一個顯著條件,將永遠不會得到優化。

現在,我認爲如果它被優化了,取決於數據庫引擎以及它是多麼的聰明。

例如,SQL Server 2005確實爲這兩種類型的查詢提供了相同的執行計劃,而MySQL 5.0.38則沒有。

+0

第二個代碼示例中有一個輸入錯誤。 %和%之間不應該有空格。 SELECT * FROM TABLE_A,TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_BAND TABLE_A.COLUMN_A LIKE'%SEARCH%'AND TABLE_B.COLUMN_B LIKE'%% – devanalyst 2009-09-25 11:51:08

0

你可以重寫你這樣的查詢:

SELECT TABLE_A.* FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B 
AND (@paramA='' or TABLE_A.COLUMN_A LIKE '%' + @paramA + '%') 
AND (@paramB='' or TABLE_B.COLUMN_B LIKE '%' + @paramB + '%') 

這樣,如果paramA上或paramB是「」,然後就是同一括號內查詢其他列將不進行查詢。

+0

我想你的意思是相反的。我檢查了上面的代碼,它的工作條件是@paramA =''這實際上是DRapp的代碼在做什麼 – devanalyst 2009-09-25 14:11:38

+0

是的,我犯了一個錯字。現在糾正它。 – Numenor 2009-09-28 12:03:31

0

使用UNION和正確的JOIN。

%foo%搜索字詞已經足夠糟糕(無法使用索引),而無需向混音中添加OR和LEN。

SELECT 
    TABLE_A.* 
FROM 
    TABLE_A 
    JOIN 
    TABLE_B On TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B 
WHERE 
    TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '%SEARCH2%' 
UNION 
SELECT 
    TABLE_A.* 
FROM 
    TABLE_A 
WHERE 
    TABLE_A.COLUMN_A LIKE '%SEARCH%' 
2

LIKE與WHERE子句一起使用來使用通配符來搜索,更新和刪除記錄。

例子:

要搜索其員工的名字是從一個字符出演的所有記錄,「A」:

select * from Employee where Name like 'a%' 

要更新名稱阿米特其員工姓名的所有記錄開始了字符'a':

update Employee set Name='amit' where Name like 'a%' 

要刪除員工姓名以字符開頭的所有記錄,'a':

delete from Employee where Name like 'a%' 
0

LIKE運算符是一個WHERE子句中使用在列

LIKE '%[p-s]' -- "It search data from table parameter where sentence ending with p,q,r,s word." 
LIKE '[0-9]' --It use for search only numeric value 
LIKE '%table%' -- it use for search parameter from table where use "table" keyword'. 
LIKE %[^p-r] -- it set the condition where Not Ending With a Range of Characters 

Example: 
SELECT T1.BrandName,T1.BrandID,T2.CategoryName,T2.Color FROM TABLE1 T1 
     LEFT JOIN TABLE2 T2 on T1.ID = T2.BrandID 
     WHERE T1.BrandName LIKE '%Samsung%' 
Example: 
SELECT T1.BrandName,T1.BrandID,T2.CategoryName,T2.Color FROM TABLE1 T1 
     LEFT JOIN TABLE2 T2 on T1.ID = T2.BrandID 
     WHERE T1.BrandName LIKE '%[a-j]'