我需要检查是否在一列或多列中找到了字符串。
基本上,我有一个程序可以让你检查多个字段(姓名,姓氏等)
如果同时检查名称和姓氏,并且用户只输入名称,例如chris,则很容易在mySQL中使用LIKE参数进行检查,如下所示:
select * from tblClients WHERE name LIKE '%john%';
这显然有效。但是,我需要做的是,如果同时检查名称和姓氏,它将执行以下操作:
select * from tblClients WHERE (name or surname) LIKE '%john%';
我希望如果在有一个名为john doe的客户端时生成此逻辑,则第二个命令仍会找到该客户端。
我尝试了这个命令并且没有找到语法错误,但是返回0结果。
请问任何建议吗?
答案 0 :(得分:4)
你不能只使用单独的WHERE子句,例如:
SELECT * FROM tblClients
WHERE (name LIKE '%john%')
OR (surname LIKE '%john%')
您必须根据用户选择的列修改SQL。
答案 1 :(得分:3)
你需要这样做:,因为SQL会阻塞(姓名或姓氏)部分
select * from tblClients WHERE name LIKE '%john%' or surname LIKE '%john%';
我不确定你使用的语言是什么,但是在伪代码中,你可以通过简单的功能使这更容易
query = [whatever you are searching for]
var columns = array('name', 'surname')
var where = array
foreach columns as column
where[] = column + ' like "%' + query + '%"'
sql = "select * from tblClients WHERE " + join(where, ' OR ');
//where join joins values of an array into a string
答案 2 :(得分:3)
您可以连接列:
,而不是使用单独的LIKE子句select *
from tblClients
WHERE name || surname LIKE '%john%'
这留下了一些边缘情况(name ='jo'和surname ='hn'将匹配),如果你担心这个,你可以在列之间添加一个分隔符
WHERE name || ' ' || surname LIKE '%john%'
我不确定这两个选项对性能的影响,但是在开始和结束时使用百分比的LIKE将不会使用索引,因此我认为不存在问题。
答案 3 :(得分:3)
我建议在OR上使用UNION - OR因性能不佳而臭名昭着,如果没有正确理解则存在风险维护问题:
SELECT c.* FROM tblClients c WHERE c.name LIKE '%john%'
UNION
SELECT c.* FROM tblClients c WHERE c.surname LIKE '%john%'
请注意,UNION
会返回一个不同的列表 - 重复项将被删除,但效果会比使用UNION ALL
(不删除重复项)慢。使用适合您目的的
答案 4 :(得分:1)
此示例列NAME和SURNAME一个查询,1个空格中间。
$Sql="SELECT * FROM customers WHERE CONCAT(NAME,' ',SURNAME) LIKE '%".$query."%' ";
//NAME = İSA
//SURNAME = ABC
//Query = İSA ABC
一个查询查找。
答案 5 :(得分:0)
我设法编程了。
这是我做的:
$like = "";
foreach ($fields as $field)
{
if ($like == "")
{
$like = $field . " LIKE '%" . $query . "%' or ";
}
else
{
$like = $like . $field . " LIKE '%" . $query . "%' or ";
}
}
$like = substr_replace($like, "", -3);
这样,所有在for循环中插入并附加到字符串的OR。然后我编写了这样的SQL字符串:
$sql = "select * ";
$sql .= " from $table where " . $like
希望这有助于其他人:)
感谢您的帖子。