2017-04-20 138 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