我有(並沒有擁有,所以我不能改變)與此類似的佈局表。是否可以查詢逗號分隔的列以獲取特定值?
ID | CATEGORIES
---------------
1 | c1
2 | c2,c3
3 | c3,c2
4 | c3
5 | c4,c8,c5,c100
我需要返回包含特定類別ID的行。我寫與LIKE語句查詢開始,因爲這些值可以是字符串中的任何
SELECT id FROM table WHERE categories LIKE '%c2%';
將返回行2和3
SELECT id FROM table WHERE categories LIKE '%c3%' and categories LIKE '%c2%';
會再次讓我行2和3,但不爲行4
SELECT id FROM table WHERE categories LIKE '%c3%' or categories LIKE '%c2%';
會再次讓我行2,3,4
我不喜歡所有的LIKE
語句。我在Oracle文檔中找到FIND_IN_SET()
,但它似乎在10g中不起作用。我收到以下錯誤:
ORA-00904: "FIND_IN_SET": invalid identifier
00904. 00000 - "%s: invalid identifier"
運行此查詢時
:SELECT id FROM table WHERE FIND_IN_SET('c2', categories);
(例如,從文檔)或該查詢:SELECT id FROM table WHERE FIND_IN_SET('c2', categories) <> 0;
(例如,從谷歌)
我希望它返回行2和3。
是否有更好的方式來編寫這些查詢,而不是使用大量的LIKE
語句?
同樣,這就是爲什麼您不在關係數據庫中放置CSV或其他序列化值的原因之一。 – NullUserException
另外'FIND_IN_SET'是一個MySQL函數,不會與Oracle – NullUserException
一起工作......並且與您看起來一樣糟糕,實際上更糟糕。除非您稍後過濾結果;你不能只搜索LIKE'%c2%' - 你實際上應該以這種方式指定每一個:「... where(categories ='c2'或類別'%,c2'或類別'%c2 ,'%'或類別'c2,%')。除非你這樣做,否則你會匹配'c20','c201'等。 – Gerrat