2015-10-03 176 views
0

表類別
ID INT
描述VARCHAR多varchar字段選擇ID

表產品
ID INT
id_cat VARCHAR
等。

id | id_cat 
1 | 1, 2, 3 
2 | 3,4,6,2 
3 | 1, 5 , 7 
. 
. 
. 

我需要這樣的東西

Select * from produts where id_cat in ('1','2') 

但不起作用!?

+0

您可以用'LIKE相反。 –

+0

對於喜歡工作的價值觀應該是有序的。 –

+0

你正在使用哪些DBMS? SQL-服務器? MySQL的? ...? –

回答

0

如果你知道你的數字是有序的,你可以使用這樣的事情:

select * from products where id_cat like '%1,%2' 

如果沒有,而像這樣:

select * from products where id_cat like '1,%' AND id_cat like '% 2,%' 

另一種可能性,這將在查詢甚至可能放慢進一步將使用rlike的正則表達式。優點是更多樣化的表達將變得可能。

確保您的表達式不會意外在兩位數字中找到單個數字。 這種方法可能有效,但以這種方式存儲值並不是一種好習慣。你依靠這些號碼列表來獲得一個固定的格式,它可以很容易地使用自由文本字符串。如果這是一個選項,請嘗試重新設計您的數據庫。將數據拆分爲更多表格,例如,以便可以使用int列。

0

你可以使用LIKE。您不想匹配部分值,因此您必須在搜索中包含逗號。這也意味着,你必須提供一個額外的逗號開頭或文本的結束搜索值:

select 
    * 
from 
    YourTable 
where 
    ',' || CommaSeparatedValueColumn || ',' LIKE '%,SearchValue,%' 

但此查詢將是緩慢的,如將所有查詢使用LIKE,尤其是與領先的通配符。

而且總會有風險。如果值的周圍有空格,或者值本身可以包含逗號(在這種情況下,它們被引號括起來(就像在csv文件中一樣),此查詢將不起作用,您將不得不添加更多邏輯,從而減慢查詢速度更。

更好的解決方案是爲這些類別添加一個子表。或者甚至是一個單獨的表格,以及一個將它們交叉鏈接到YourTable的表格。

https://stackoverflow.com/a/7212980/1235298

2
id | id_cat 
1 | 1, 2, 3 

你的數據庫佈局不允許有每個產品的多個類別 - 只允許一個產品類別。 您需要的是一個額外的表來保存產品類別關係。 另外,使用LIKE的代價很高,我建議使用JOIN代替。

試試這個結構:

CREATE TABLE category (
    id INT PRIMARY KEY, 
    description VARCHAR(255) 
); 

CREATE TABLE product (
    id INT PRIMARY KEY, 
    category_id INT, 
    description VARCHAR(255) 
); 

CREATE TABLE product_category (
    product_id INT, 
    category_id INT 
); 

然後,您可以連接表,使用類似這樣的SQL:

SELECT C.Name as "Category Name", P.Name as "Product Name" 
FROM Product P 
INNER JOIN ProductCategory PC ON P.ProductID = PC.ProductID 
INNER JOIN Category C ON PC.CategoryID = C.CategoryID 
ORDER BY C.Name, P.Name; 

有關工作示例,請參閱http://www.java2s.com/Code/Oracle/Table-Joins/GetCategoriesandProductswithJoins.htm