2010-07-15 74 views
0

我的员工表中有一列MetaKeys。它包含如下所示像一个值:在Oracle列中搜索特定值

MetaKeys="DocType=1***SubDocType=2***MinValue=123" 

如何查询我的表,然后从MetaKeys列取只是SubDocType价值?

Select * from employee where Metakeys contains SubDocType=2 
+0

在本专栏中您有3位信息。如果你发现自己需要编写这种查询,可能有时间将它们分开? – 2010-07-15 18:18:53

回答

0

我同意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) 
0
SELECT * FROM employee WHERE Metakeys LIKE '%SubDocType=2%' 

这不是在做查询,因为你不会得到任何好处索引的最有效的方式,但它的作品。

0

做的是固定设计,使有没有在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搜索时拖网的性能问题,你将不必写正则表达式寻找与多个键值对员工时。