5

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

假设我有两个表,TABLE_ATABLE_B带有列KEYCOLUMN_ACOLUMN_AinTABLE_A和列FKCOLUMN_BCOLUMN_Bin 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 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 %%与删除条件本身一样好?

4

7 回答 7

10

在“B”表周围环绕OR,例如:

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

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

您可以根据需要对尽可能多的链接表应用相同的方法。

于 2009-09-25T11:24:45.053 回答
2

首先,您的示例中有一个空格:

AND TABLE_B.COLUMN_B LIKE '% %'

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

现在,我认为是否对其进行优化取决于数据库引擎及其智能程度。

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

于 2009-09-25T11:31:05.553 回答
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%'
于 2012-11-17T09:25:16.480 回答
0

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

于 2009-09-25T11:27:26.233 回答
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 为 '',则在相同括号内查询的其他列将不会被查询。

于 2009-09-25T12:00:31.847 回答
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%'
于 2009-09-25T15:28:00.210 回答
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]'
于 2015-02-18T03:43:56.780 回答