我的员工表中有一列MetaKeys。它包含如下所示像一个值:在Oracle列中搜索特定值
MetaKeys="DocType=1***SubDocType=2***MinValue=123"
如何查询我的表,然后从MetaKeys列取只是SubDocType价值?
Select * from employee where Metakeys contains SubDocType=2
我的员工表中有一列MetaKeys。它包含如下所示像一个值:在Oracle列中搜索特定值
MetaKeys="DocType=1***SubDocType=2***MinValue=123"
如何查询我的表,然后从MetaKeys列取只是SubDocType价值?
Select * from employee where Metakeys contains SubDocType=2
我同意Martin Smith的看法,您可能需要将这些信息标准化。话虽这么说,这里是一个可能的解决方案,它可以为你工作:
SELECT SUBSTR (expr, INSTR (expr, '=') + 1) subdoctypeval
FROM (SELECT REGEXP_SUBSTR ('DocType=1***SubDocType=2***MinValue=123',
'SubDocType=[^*]+',
1,
1)
expr
FROM DUAL)
SELECT * FROM employee WHERE Metakeys LIKE '%SubDocType=2%'
这不是在做查询,因为你不会得到任何好处索引的最有效的方式,但它的作品。
做的是固定设计,使有没有在EMPLOYEE表中的metakeys列,而是一个EMPLOYEE_METAKEY表中的正确的事情:
CREATE TABLE EMPLOYEE_KEY_VALUES
(EMP_ID number,
EMP_METAKEY VARCHAR2(100),
EMP_METAVALUE VARCHAR2(1000),
constraint EMPLOYEE_METAKEYS_PK primary key (EMP_ID, EMP_METAKEY) using index,
constraint EMPLOYEE_METAKEYS_FK01 foreign key (EMP_ID)
references EMPLOYEE (EMP_ID) on delete cascade
);
这样的设计不会有通过雇员表做metakey搜索时拖网的性能问题,你将不必写正则表达式寻找与多个键值对员工时。
在本专栏中您有3位信息。如果你发现自己需要编写这种查询,可能有时间将它们分开? – 2010-07-15 18:18:53