SQL在同一字段中搜索多个值

Posted

技术标签:

【中文标题】SQL在同一字段中搜索多个值【英文标题】:SQL search multiple values in same field 【发布时间】:2013-04-20 20:10:17 【问题描述】:

我正在构建一个简单的搜索算法,我想用空格打破我的字符串,然后搜索我的数据库,如下所示:

$search = "Sony TV with FullHD support";  
$search = explode( ' ', $search );

SELECT name FROM Products WHERE name LIKE %$search[1]% AND name LIKE %$search[2]% LIMIT 6

这可能吗?

【问题讨论】:

绝对 - 这是可能的,并且一直在使用。如果您需要程序员为您编写代码,那么有很多网站可以做到这一点。以领英为例。但是,对于本网站,请询问有关特定代码的问题,而不是要求为您编写代码。展示您尝试过的内容以及发现的内容......等等。 谢谢,我不想我的代码是为我写的,只是想知道怎么做。我的代码看起来和我上面写的完全不同。 【参考方案1】:

是的,您可以使用 SQL IN 运算符搜索多个绝对值:

SELECT name FROM products WHERE name IN ( 'Value1', 'Value2', ... );

如果您想使用LIKE,则需要使用OR

SELECT name FROM products WHERE name LIKE '%Value1' OR name LIKE '%Value2';

使用AND(如您尝试的那样)需要所有条件都为真,使用OR 需要至少一个条件为真。

【讨论】:

虽然这回答了您的问题,但您可能想要比我们的任何一种解决方案更复杂的解决方案,搜索 OR 但首先显示最相关(最匹配)的结果。 我正在使用 SQL Server 并尝试做同样的事情。但是,我将搜索字符串作为参数传递给存储过程。当我不知道用户搜索之前的值时,如何根据空格分解搜索字符串参数,然后将所有“LIKE '%Value1% OR .....”添加到 where 子句?跨度> 我很确定在大多数简单的情况下AND 是正确的搜索。如果用户打扰输入一个单词,他们可能希望它在 90% 的时间出现在结果中。想想谷歌搜索:[+"bob" +"hope"] 作为OR 搜索绝对没用。并原谅谷歌在半有用的搜索中完全荒谬的引用要求。此外,AND 是难以获得的独特功能,而OR 您只需运行 2 次搜索,看看是否有一个成功。【参考方案2】:

试试这个

使用UNION

$sql = '';
$count = 0;
foreach($search as $text)

  if($count > 0)
     $sql = $sql."UNION Select name From myTable WHERE Name LIKE '%$text%'";
  else
     $sql = $sql."Select name From myTable WHERE Name LIKE '%$text%'";

  $count++;

使用WHERE IN

$comma_separated = "('" . implode("','", $search) . "')";  // ('1','2','3')
$sql = "Select name From myTable WHERE name IN ".$comma_separated ;

【讨论】:

【参考方案3】:

这在两种情况下都可以完美运行,一个或多个字段搜索多个单词。

希望这会对某人有所帮助。谢谢

declare @searchTrm varchar(MAX)='one two three four'; 
--select value from STRING_SPLIT(@searchTrm, ' ') where trim(value)<>''
select * from Bols 
WHERE EXISTS (SELECT value  
    FROM STRING_SPLIT(@searchTrm, ' ')  
    WHERE 
        trim(value)<>''
        and(    
        BolNumber like '%'+ value+'%'
        or UserComment like '%'+ value+'%'
        or RequesterId like '%'+ value+'%' )
        )

【讨论】:

【参考方案4】:

这里已部分回答: mysql Like multiple values

我反对

$search = explode('', $search);

并将它们直接输入到 SQL 查询中,因为这很容易通过搜索栏进行 SQL 注入。您必须先对字符进行转义,以防他们尝试一些有趣的事情,例如:“--; DROP TABLE name;

$search = str_replace('"', "''", 搜索);

但即使这样也不是完全安全的。您必须尝试使用​​ SQL 准备好的语句才能更安全。使用正则表达式更容易构建函数来准备和创建您想要的内容。

function makeSQL_search_pattern($search) 
    search_pattern = false;
    //escape the special regex chars
    $search = str_replace('"', "''", $search);
    $search = str_replace('^', "\\^", $search);
    $search = str_replace('$', "\\$", $search);
    $search = str_replace('.', "\\.", $search);
    $search = str_replace('[', "\\[", $search);
    $search = str_replace(']', "\\]", $search);
    $search = str_replace('|', "\\|", $search);
    $search = str_replace('*', "\\*", $search);
    $search = str_replace('+', "\\+", $search);
    $search = str_replace('', "\\", $search);
    $search = str_replace('', "\\", $search);
    $search = explode(" ", $search);
    for ($i = 0; $i < count($search); $i++) 
        if ($i > 0 && $i < count($search) ) 
           $search_pattern .= "|";
        
        $search_pattern .= $search[$i];
    
    return search_pattern;


$search_pattern = makeSQL_search_pattern($search);
$sql_query = "SELECT name FROM Products WHERE name REGEXP :search LIMIT 6"
$stmt = pdo->prepare($sql_query);
$stmt->bindParam(":search", $search_pattern, PDO::PARAM_STR);
$stmt->execute();

我没有测试过这段代码,但这是我在你的情况下会做的。 我希望这会有所帮助。

【讨论】:

【参考方案5】:

您可以尝试执行以下查询:

SELECT name FROM Products WHERE REGEXP '.*Value1|.*Value2'; 

请注意管道符号前后不能有空格 (|)。

【讨论】:

【参考方案6】:

我知道这是很久以前的事了,但我有一个解决方案。可以这样解决:

#intial query 

query = 'SELECT var1, var2 FROM dbo.db_name WHERE'

if status :

        query = query + " AND status='" + status + "'"

if type :

        query = query + " AND Type='" + type + "'"  

if number :

        query = query + " AND Number='" + number + "'"

if cancel_request:

        query = query + " AND CancelRequest='" + cancel_request + "'"


query = query + ' ORDER BY transid DESC'


cur.execute(query)        

【讨论】:

以上是关于SQL在同一字段中搜索多个值的主要内容,如果未能解决你的问题,请参考以下文章

jQuery Chosen:在同一页面上显示多个选择字段

有效地更新同一字段多个对象django

sql server 2005 一个索引多个字段,字段的排列顺序对搜索有啥影响??

sql 对同一字段进行模糊查询时如何将两个条件写入一个like中

SQL 多选一个字段值只选一次 和多次从表里查询但查的字段较少 相比哪个性能更好?为啥?

MYSQL怎么将表中的A字段值更新B字段值?求sql语句