2009-09-25 77 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]'