表類別
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')
但不起作用!?
表類別
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')
但不起作用!?
如果你知道你的數字是有序的,你可以使用這樣的事情:
select * from products where id_cat like '%1,%2'
如果沒有,而像這樣:
select * from products where id_cat like '1,%' AND id_cat like '% 2,%'
另一種可能性,這將在查詢甚至可能放慢進一步將使用rlike
的正則表達式。優點是更多樣化的表達將變得可能。
確保您的表達式不會意外在兩位數字中找到單個數字。 這種方法可能有效,但以這種方式存儲值並不是一種好習慣。你依靠這些號碼列表來獲得一個固定的格式,它可以很容易地使用自由文本字符串。如果這是一個選項,請嘗試重新設計您的數據庫。將數據拆分爲更多表格,例如,以便可以使用int列。
你可以使用LIKE。您不想匹配部分值,因此您必須在搜索中包含逗號。這也意味着,你必須提供一個額外的逗號開頭或文本的結束搜索值:
select
*
from
YourTable
where
',' || CommaSeparatedValueColumn || ',' LIKE '%,SearchValue,%'
但此查詢將是緩慢的,如將所有查詢使用LIKE,尤其是與領先的通配符。
而且總會有風險。如果值的周圍有空格,或者值本身可以包含逗號(在這種情況下,它們被引號括起來(就像在csv文件中一樣),此查詢將不起作用,您將不得不添加更多邏輯,從而減慢查詢速度更。
更好的解決方案是爲這些類別添加一個子表。或者甚至是一個單獨的表格,以及一個將它們交叉鏈接到YourTable的表格。
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
您可以用'LIKE相反。 –
對於喜歡工作的價值觀應該是有序的。 –
你正在使用哪些DBMS? SQL-服務器? MySQL的? ...? –