在数据库设计中,有一种情况是比较头痛的,就是一条业务数据有一个字段是多个值拼起来的,如一个设备有多个维护部门。
create table devcie
(
devcie_id number,
vindicate_dept_id varchar2(100)
);
insert into devcie values(1,'11');
insert into devcie values(2,'22');
insert into devcie values(3,'1111');
insert intodevcie values(4,'33');
insert into devcie values(5,'1111;22');
insert into devcie values(6,'11;22');
insert intodevcie values(7,'11;22;33');
insert into devcie values(8,'22;33');
commit;
问题出来了,如果要查dept_id为11的部门,下面看我们查一下:
SQL> select * from devcie where vindicate_dept_id like '%11%';
DEVCIE_ID VINDICATE_DEPT_ID
---------- --------------------------------------------------------
1 11
3 1111
5 1111;22
6 11;22
7 11;22;33
换一种查询方式:
SQL> select * from devcie where instr(vindicate_dept_id,'11')>0;
DEVCIE_ID VINDICATE_DEPT_ID
---------- -----------------------------------------------------------
1 11
3 1111
5 1111;22
6 11;22
7 11;22;33
在换一种方式,考虑部门只有一个值的情况=‘11’,多个值的情况在最前面like '11;%',在最后面'%;11',在中间'%;11;%',这下全了,执行一下:
SQL> select * from devcie where vindicate_dept_id ='11'
or vindicate_dept_id like '11;%'
or vindicate_dept_id like '%;11'
or vindicate_dept_id like '%;11;%';
DEVCIE_ID VINDICATE_DEPT_ID
---------- --------------------------------------------
1 11
6 11;22
7 11;22;33
崩溃啊,要这么复杂吗?如何解决呢?
update devcie set vindicate_dept_id = ';'||vindicate_dept_id||';';
commit;
SQL> select * from devcie;
DEVCIE_ID VINDICATE_DEPT_ID
---------- -----------------------------------------
1 ;11;
2 ;22;
3 ;1111;
4 ;33;
5 ;1111;22;
6 ;11;22;
7 ;11;22;33;
8 ;22;33;
再次查询为11的部门就没问题了。
SQL> select * from devcie where instr(vindicate_dept_id,';11;')>0;
DEVCIE_ID VINDICATE_DEPT_ID
---------- --------------------------------------------------------
1 ;11;
6 ;11;22;
7 ;11;22;33;
SQL> select * from devcie where vindicate_dept_id like '%;11;%';
DEVCIE_ID VINDICATE_DEPT_ID
---------- -----------------------------------------------------------
1 ;11;
6 ;11;22;
7 ;11;22;33;