-1

是否可以在 SQL 查询中将 WHERE 作为通配符?

我有这个简单的查询:

SQL = "SELECT ID, Firstname, Lastname, Company, City, Email FROM table WHERE * LIKE '%" & q & "%';"

假设变量 q 等于“John Doe”。然后我希望查询在 Firstname AND/OR (??) Lastname 中搜索 q。

我只能想办法。

非常感谢/安德烈亚斯

编辑/更新:

我会尽量简化我的问题。

假设我有一个包含 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”的所有人的列表

4

8 回答 8

4
SELECT  ID, Firstname, Lastname, Company, City, Email
FROM    mytable
WHERE   firstname LIKE '%" & q & "%' OR lastname LIKE '%" & q & "%' -- Replace OR with AND as necessary
于 2009-11-25T15:28:05.013 回答
4

强制性 XKCD

于 2009-11-25T16:02:09.627 回答
2

不,您必须指定要搜索的字段。当然,您意识到在 like 语句的开头使用通配符也意味着无法使用索引并且您的查询会很慢。一开始你真的需要那些通配符吗?根据您的要求,我怀疑不是。

如果您的变量同时包含名字和姓氏,则此查询也可能有效:

SELECT  ID, Firstname, Lastname, Company, City, Email
FROM    mytable
WHERE   firstname + " " +lastname LIKE '%" & q & "%'

当然,如果 firstname 或 lastname 可以包含空值,您可能需要添加一个 isnull 或合并到它。

于 2009-11-25T15:30:57.787 回答
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 运算符而不是 =。

于 2009-11-25T15:53:44.867 回答
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 注入。每个回答但没有提到这一点的人都应该被否决;-)

于 2009-11-26T14:23:32.717 回答
0

为了做你正在寻找的东西,我认为你应该使用动态 SQL。基本上将查询的元素连接到 nvarchar(max) 变量中,然后使用 EXEC 或 sp_execsql 命令运行查询。请注意,sp_execsql 支持参数化查询,而 EXEC 不支持。

希望有帮助!

于 2009-11-26T14:27:01.493 回答
0

在 SQL 的 WHERE 或 ON 子句中对一堆条件进行 OR 运算对性能来说是很糟糕的。

如果您不喜欢我对全文索引的建议,我会在这里建议另一种选择。由于 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 注入 :)

于 2009-11-26T14:30:25.497 回答
0

连接所有字段,然后使用单个“LIKE”:

 SELECT ID, Firstname, Lastname, Company, City, Email 
   FROM table 
   WHERE ID||Firstname||Lastname||Company||City||Email  LIKE '%" & q & "%';"
于 2009-11-26T14:05:43.533 回答