是否可以在SQL查询中将WHERE作为通配符?
我有这个简单的查询:
SQL = "SELECT ID, Firstname, Lastname, Company, City, Email FROM table WHERE * LIKE '%" & q & "%';"
让变量q等于“John Doe”。然后我希望查询在名字和/或(??)姓氏中搜索q。
我可以搞清楚。
非常感谢 /安德烈亚斯
EDIT / UPDATE:
我会尝试简化我的问题。
假设我有一个带有ID,名字,姓氏和电子邮件字段的数据库表。 (fx的值为:5,john,Doe,JD @ hotmail.com)
然后我在页面上有一个简单的html表单和一个搜索字段(一个带有提交按钮的简单文本输入),访问者可以在该页面上搜索上面的任何字段。
如果他/她搜索单词“John”,或“Doe”或“hotmail”,它在我的ASP页面上将搜索字符串作为变量“q”的SQL查询完美地完成,如下所示:
SQL = "SELECT ID, Firstname, Lastname,Email FROM table WHERE ID LIKE '%" & q & "%', OR Firstnamne LIKE '%" & q & "%', OR Lastname LIKE '%" & q & "%' OR Email LIKE '%" & q & "%';"
现在我的问题是:如果访客输入“John Doe”,我该怎么办?
我希望能够获得名为“John Doe”的数据库中所有人的列表
答案 0 :(得分:4)
SELECT ID, Firstname, Lastname, Company, City, Email
FROM mytable
WHERE firstname LIKE '%" & q & "%' OR lastname LIKE '%" & q & "%' -- Replace OR with AND as necessary
答案 1 :(得分:4)
答案 2 :(得分:2)
不,您必须指定要搜索的字段。当然,您意识到在类似语句的开头使用通配符也意味着无法使用索引并且查询速度很慢。你真的需要那些通配符吗?根据你的要求,我怀疑不是。
如果您的变量同时包含名字和姓氏,则此查询也可能有效:
SELECT ID, Firstname, Lastname, Company, City, Email
FROM mytable
WHERE firstname + " " +lastname LIKE '%" & q & "%'
当然,如果first或lastname可以包含空值,则可能需要添加isnull或coalesce。
答案 3 :(得分:0)
我过去使用存储过程完成了这种方法:
SELECT ID, Firstname, Lastname, Company, City, Email
FROM mytable
WHERE
(@pFirstName is null or FirstName = @pFirstName)
and (@pLastName is null or LastName = @pLastName)
and (@pCompany is null or Company = @pCompany)
and (@pCity is null or City = @pCity)
and (@pEmail is null or Email = @pEmail)
您可以为您可能希望包含在where子句中的每个比较定义一个参数;如果您不想按特定字段进行查询,则只需将null传递给相应的参数,或者根本不传递值,并将参数的默认值设为null。
编辑:如果要在“OR”和“AND”之间切换,则可以添加另一组参数。我知道这些参数看起来很混乱,但它确实有效:
SELECT ID, Firstname, Lastname, Company, City, Email
FROM mytable
WHERE
(@pAndFirstName is null or FirstName = @pAndFirstName)
and (@pAndLastName is null or LastName = @pAndLastName)
and (@pAndCompany is null or Company = @pAndCompany)
and (@pAndCity is null or City = @pAndCity)
and (@pAndEmail is null or Email = @pAndEmail)
and ( (
-- either all of the "OR" parameters are null
@pOrFirstName is null
and @pOrLastName is null
and @pOrCompany is null
and @pOrCity is null
and @pOrEmail is null
) or (
-- or at least one of them must match
or (FirstName = @pOrFirstName)
or (LastName = @pOrLastName)
or (Company = @pOrCompany)
or (City = @pOrCity)
or (Email = @pOrEmail)
))
当然,如果需要,您可以选择使用LIKE运算符而不是=。
答案 4 :(得分:0)
连接所有字段,然后使用单个“LIKE”:
SELECT ID, Firstname, Lastname, Company, City, Email
FROM table
WHERE ID||Firstname||Lastname||Company||City||Email LIKE '%" & q & "%';"
答案 5 :(得分:0)
我建议您查看全文搜索。它提供了几个好处,允许您搜索多个列。
根据您使用的SQL Enginge,它或多或少都会强大。
我没有记住新的语法,但对于MySQL来说,它类似于:
创建表时:
CREATE TABLE ... (
ID ...
, ...
, FULLTEXT (Firstname, Lastname, Company, City, Email)
);
然后做:
SELECT *
FROM ...
WHERE MATCH (Firstname, Lastname, Company, City, Email) AGAINST ('<KEYWORD>') > 0;
检查SQL引擎的手册以获得正确的语法/用法。
另外:正如Lucero暗示:记住SQL注入。所有回复但未提及此事的人都应该被投票; - )
答案 6 :(得分:0)
为了做你想要的,我认为你应该使用动态SQL。基本上将查询的元素连接到nvarchar(max)变量,并使用EXEC或sp_execsql命令运行查询。请注意,sp_execsql支持参数化查询,而EXEC不支持。
希望有所帮助!
答案 7 :(得分:0)
在SQL的WHERE或ON子句中对一堆条件进行OR运算对性能来说很糟糕。
如果你不喜欢我对FULL TEXT指数的建议,我建议另外一个选择。 由于LIKE开头的通配符,它也不是最佳性能,但可能比许多OR更好。
在表格上创建一个新列,它是您要搜索的字段的串联。 如果SQL引擎支持它,则可以是计算列。
在MS SQL中,它看起来像:
ALTER TABLE ... ADD COLUMN MatchCode AS FirstName + LastName + Email + ...
如果您不能使用计算列,则必须在每次更新时设置此列的值:
UPDATE x
SET MatchCode = FirstName + LastName + <NewEmailValue> + ...
, Email = <NewEmailValue>
FROM ... AS x
WHERE ...
然后你可以简单地做
SELECT ...
FROM ... AS x
WHERE x.MatchCode LIKE '%<keyword>%'
再次,记住SQL注入:)