现在有个expert专家表,表的一个字段为trade所属行业 ,字段里面保存的varchar2的,格式为“a,b,c”。 保存了3个行业, a,b,c。其中,第一个“,”前面的a为这个专家的主要行业。后面的b,c为附属行业我现在要查出N个行业为“0102计算机外部设备”的专家。查询条件是,首先从 trade查出 第一个“,”前面的为“0102计算机外部设备”行业,如果查询结果B>N.就直接取N个,如果查询结果B<N, 不足的结果从后面 的b,c中选择行业为“0102计算机外部设备”取。请教该如何实现?
select 专家ID from expert where trade like '0102计算机外部设备,%';
看还少几条(假如少A条)再执行
select 专家ID from expert where trade like '%,0102计算机外部设备%' and rownum <= A;
如果有其它行业的前缀与“0102计算机外部设备”相同的话第二个语句还不能这样写,得分成以下两步:
select 专家ID from expert where trade like '%,0102计算机外部设备,%' and rownum <= A;
看还少几条(假如少B条)再执行
select 专家ID from expert where trade like '%,0102计算机外部设备' and rownum <= B;
select 专家ID from expert where trade like '0102计算机外部设备,%' and rownum <= N;
SELECT * FROM
(SELECT A.* FROM expert A WHERE SUBSTR(trade,1,INSTR(TRATE,',')-1)='0102计算机外部设备'
UNION ALL
SELECT B.* FROM expert B WHERE INSTR(SUBSTR(TRADE,1,INSTR(TRATE,',')+1),'0102计算机外部设备')>1)
WHERE ROWNUM<=N
1. 建一个函数,取得“0102计算机外部设备”这个字串在trade的位置,其函数为: CREATE OR REPLACE FUNCTION get_pos(p_trade IN VARCHAR2, p_str IN VARCHAR2) RETURN NUMBER AS
l_trade VARCHAR2(1000);
l_tab DBMS_UTILITY.uncl_array;
l_tablen NUMBER;
BEGIN
l_trade := REPLACE(p_trade, ',', ',X'); --这句没有实际意义,就是为了能够利用DBMS_UTILITY.comma_to_table
DBMS_UTILITY.comma_to_table (l_trade, l_tablen, l_tab); for i in 1..l_tablen loop
IF instr(l_tab(i), p_str) > 0 THEN
RETURN i;
END IF;
end loop; RETURN 0;
END;
/2. 然后利用此函数求出每个位置上的'0102计算机外部设备'有多少人,有了这个数据,就可以心中有数了。 SELECT SUM(DECODE(pos,1,1,0)) pos1_num,
SUM(DECODE(pos,2,1,0)) pos2_num,
SUM(DECODE(pos,3,1,0)) pos3_num
FROM (
SELECT get_pos(trade, '0102计算机外部设备') pos FROM expert
);
SELECT * FROM
(SELECT A.* FROM expert A WHERE SUBSTR(trade,1,INSTR(TRATE,',')-1)='0102计算机外部设备'
UNION ALL
SELECT B.* FROM expert B WHERE INSTR(SUBSTR(TRADE,INSTR(TRATE,',')+1),'0102计算机外部设备')>1)
WHERE ROWNUM<=N
但是这样做不并能保障楼主说的优先选择第一行业符合条件的人,另外如果存在其它行业的前面部分也是“0102计算机外部设备”的情况下就会选错行业啊。