表类别
id int
description 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 :(得分: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
答案 1 :(得分: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列。
答案 2 :(得分:0)
你可以使用LIKE。您不希望匹配部分值,因此您必须在搜索中包含逗号。这也意味着您必须提供额外的逗号来搜索文本开头或结尾的值:
select
*
from
YourTable
where
',' || CommaSeparatedValueColumn || ',' LIKE '%,SearchValue,%'
但是这个查询会很慢,所有使用LIKE的查询都会很慢,尤其是使用前导通配符。
总是存在风险。如果值周围有空格,或者值本身可以包含逗号,在这种情况下它们被引号括起来(比如在csv文件中),这个查询不会起作用,你必须添加更多的逻辑,更慢地减慢您的查询。
更好的解决方案是为这些类别添加子表。或者更确切地说,甚至是一个单独的catagories表,以及一个将它们交叉链接到YourTable的表。