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在同一字段中搜索多个值的主要内容,如果未能解决你的问题,请参考以下文章
sql server 2005 一个索引多个字段,字段的排列顺序对搜索有啥影响??
sql 对同一字段进行模糊查询时如何将两个条件写入一个like中