2017-04-20 104 views
1

让我们考虑以下表为例搜索查询完全

表 - 科目

ID  | subject 
------ | --------------- 
1  | maths, science 
2  | maths, science, english 
3  | english, computer 

查询

SELECT * FROM subjects WHERE subject LIKE '%maths%' AND subject LIKE '%science%' 

当我运行上面的查询出认沽将如如下

ID  | subject 
------ | --------------- 
1  | maths, science 
2  | maths, science, english 

我的问题:

是可以修改上面的查询得到如下的结果完全匹配的搜索两个参数,即使搜索的顺序被改变 即

SELECT * FROM subjects WHERE subject LIKE '%science%' AND subject LIKE '%maths%' 

期望的结果:

ID  | subject 
------ | --------------- 
1  | maths, science 
+0

'喜欢IN' - 这个操作并不存在于SQL Server中,查询抛出错误。 –

+0

@VojtěchDohnal抱歉,我现在修改了查询。 –

+2

我真的会修改我的数据库设计,而不是以逗号分隔的列表存储值。它将在未来为您节省很多麻烦。 –

回答

1

这个数据库设计不好,用关联表代替逗号分隔列表。

您可以使用LEN来检查subject以外是否有其他值,除了指定的值。

SELECT * FROM subjects WHERE subject LIKE '%science%' AND subject LIKE '%maths%' 
         AND LEN(subject) <= LEN('maths, science') 
+0

谢谢!我相信这解决了我的问题。让我进行测试。 –

1

您可以只用CHARINDEX(),因为它会检查是否存在都和你可以用它执行的订单达到同样的效果。

SELECT * 
FROM subjects 
WHERE CHARINDEX('maths', subject, 0) < CHARINDEX('science', subject, 0) -- enforces order 
    AND CHARINDEX('maths', subject, 0) > 0 -- to make sure that your "first word" exists