将SQL LIKE运算符与%%一起使用

时间:2009-09-25 11:17:36

标签: sql-server pattern-matching sql-like

我需要在SQL Server中创建一个查询,其中搜索条件将根据用户输入包含/排除表。

假设我有两个表TABLE_ATABLE_BKEYCOLUMN_A中的列COLUMN_ATABLE_A以及FKCOLUMN_B列和{{1}在COLUMN_B

和查询一样:

TABLE_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 ELSEIF语句。

相反,我决定保持声明不变。因此,如果ELSE为空,则查询将有效地变为:

SEARCH2

SQL优化器能否认识到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 '% %' 与删除条件本身一样好?

8 个答案:

答案 0 :(得分:9)

在“B”表周围包裹OR,例如:

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

这样,如果没有字符串的值,它的长度将为零,并且OR的第一部分将被评估,则总是返回true,并将等式的该部分返回为有效并忽略另一半使用LIKE子句。

您可以根据需要为多个链接表应用相同的内容。

答案 1 :(得分:2)

首先,你的例子中有一个空格:

AND TABLE_B.COLUMN_B LIKE '% %'

这永远不会被优化,因为它确实是一个重要的条件。

现在,我认为如果它被优化,取决于数据库引擎以及它的智能程度。

例如,SQL Server 2005确实为两种类型的查询提供相同的执行计划,而MySQL 5.0.38则没有。

答案 2 :(得分:2)

LIKE与WHERE子句一起使用外卡来搜索,更新和删除记录。

示例:

要搜索员工姓名由角色加注的所有记录,“a”:

select * from Employee where Name like 'a%'

要更新名称为 amit 的所有记录,其员工姓名以字符“a”开头:

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

要删除员工姓名以字符开头的所有记录,“a”:

delete from Employee  where Name like 'a%'

答案 3 :(得分:0)

MySQL中,你也可以使用ILIKE,然后它不区分大小写。

答案 4 :(得分:0)

我在这个主题上见过的最广泛的文章(SQL Server) 是 Dynamic Search Conditions in T-SQL by Erland Sommarskog

答案 5 :(得分: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为'',则不会查询在相同括号内查询的其他列。

答案 6 :(得分: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%'

答案 7 :(得分:0)

在WHERE子句中使用LIKE运算符来搜索列中的指定模式

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]'