在Oracle中的列中搜索特定值

时间:2010-07-15 18:12:51

标签: sql oracle10g

我的员工表中有一列MetaKeys。它包含如下所示的值:

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

如何查询我的表并从MetaKeys列中仅获取SubDocType值?

Select * from employee where Metakeys contains SubDocType=2

3 个答案:

答案 0 :(得分:0)

SELECT * FROM employee WHERE Metakeys LIKE '%SubDocType=2%'

这不是最有效的查询方式,因为您不会获得任何索引优势,但它确实有效。

答案 1 :(得分: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)

答案 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
);

此设计不会产生在执行元键搜索时必须遍历员工表的性能问题,并且在查找具有多个键值对的员工时不必编写正则表达式。