现在有个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计算机外部设备”取。请教该如何实现?

解决方案 »

  1.   

    可以用 ','||trade||',' 拼接后用instr()分
      

  2.   

    没法用一个语句实现,可以先
    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;
      

  3.   

    上面的第一条语句应该是:
    select 专家ID from expert where trade like '0102计算机外部设备,%' and rownum <= N; 
      

  4.   


    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
      

  5.   

    建议,
    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
             );
      

  6.   

    其实我知道你想说什么,我已考虑到了,你的语句是不是这样的啊:
    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计算机外部设备”的情况下就会选错行业啊。