我需要在SQL Server中创建一个查询,其中搜索条件将根据用户输入包含/排除表。
假设我有两个表TABLE_A
和TABLE_B
,KEYCOLUMN_A
中的列COLUMN_A
和TABLE_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 ELSE
和IF
语句。
相反,我决定保持声明不变。因此,如果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 '% %'
与删除条件本身一样好?
答案 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]'