问题如下:某表的一个字段,数据形如“001|002|003|”,001等是store_code;
该字段可以通过pl/sql取出并赋值给变量,假设变量名为v_store_str;现在需要查询,用上面的变量作为where的限制。
我的做法如下,不成功
select * from dim_store ds where ds.store_code in (select ''''||replace(SUBSTR(v_store_str,1,length(v_store_str)-1) ,'|',''',''')||'''' store_code from dual);请高手指点,
谢谢!

解决方案 »

  1.   

    --多了'''
    select * from dim_store ds where ds.store_code in 
     (select ''''||replace(SUBSTR(v_store_str,1,length(v_store_str)-1) ,'|',''')||'''' store_code from dual);
      

  2.   


     SELECT ''''||replace(SUBSTR('001|002|003|',1,length('001|002|003|')-1) ,'|',''',''')||'''' dd FROM DUAL  
    的查询结果是: '001','002','003'
      

  3.   


    --001|002|003|”, 变成001,002,003这样?select * from dim_store ds 
    where ds.store_code in (select ''''||replace(SUBSTR(v_store_str,1,length(v_store_str)-1) ,'|',',')||'''' store_code from dual);
      

  4.   


    --楼主我的测试数据 001|002|003 均为数值类型!所以有string+0的actionselect * from dim_store ds where ds.store_code in (
    select b.* from
    (
    select substr(test,1,instr(test,'|',1)-1)+0 from tt_name
    union
    select substr(test,instr(test,'|',2)+1,1)+0 from tt_name
    union
    select substr(test,instr(test,'|',3)+1,1)+0 from tt_name)b )
      

  5.   

    SELECT ds.store_code into v_store_2 FROM DIM_STORE DS WHERE DS.STORE_CODE IN (SELECT ''''||replace(SUBSTR('001|002|003|',1,length('001|002|003|')-1) ,'|',''',''')||'''' dd FROM DUAL);
    会提示找不到数据~~~~
    问题在where处,不知道怎么弄,&&
      

  6.   


    可能是俺表述不清,
    简单说是这样,select ds.store_code from dim_store ds where ds.store_code in ('001','002','003');
    是可以正确的;
    现在需要把'001','002','003'地方用变量来传递进来,
    因为'001','002','003' 在别的表的别的字段里以001|002|003的形式存放。
      

  7.   


    SQL> select ''''||replace('001|002|003','|',''',''')||'''' from dual;
     
    ''''||REPLACE('001|002|003','|
    ------------------------------
    '001','002','003'
     
    SQL> 
    这样?
      

  8.   


    最好在程序里面拼接SQL语句 
      

  9.   


    --明白你的意思。
    原来的做法就是在PHP中用字符串连接,是可以是实现的。
    现在准备全部用PL/SQL写,所以遇到这个问题。
      

  10.   

    是的,
    只不过,现在的001|002|003通过变量传递进来,放在where里就不行了。
    我再看看,有没有其他的解决方法。
    谢谢大家!
      

  11.   

    找到了解决方案,网络搜索真是好,测试一下回来封贴子。
    其实是oracle 存储过程 sql中in调用动态变量的问题http://zhidao.baidu.com/question/145940726.html?push=qlhttp://www.mscto.com/Javatec/301028205.html
      

  12.   

    select * from dim_store ds where instr('|'||v_store_str,'|'||ds.store_code||'|')>0 
      

  13.   

    问题解决。
    思路如下,
    declare
        v_store_str_2 varchar2(2000);
        v_result      number(3);
     begin
    select tt.t   into v_store_str_2
          from (select '''' || replace(SUBSTR(v_store_str,1,length(v_store_str) - 1),
                                       '|',   ''',''') || '''' t   from dual) tt; execute immediate 'select sum(fsi.qty) sum_sold_qty 
                 from fact_sales_item fsi, dim_invn_item dii, dim_store ds 
              where fsi.item_sid = dii.item_sid and ds.store_no = fsi.store_no  
                    and ds.store_code in (' ||v_store_str_2 || ')                  and  dii.upc = 2210003861074  
          and fsi.qty > 0'
          into v_result;
      

  14.   


    declare
        v_store_str_2 varchar2(2000);
        v_result      number(3);
     begin
    select tt.t   into v_store_str_2
          from (select '''' || replace(SUBSTR(v_store_str,1,length(v_store_str) - 1),
                                       '|',   ''',''') || '''' t   from dual) tt; execute immediate 'select sum(fsi.qty) sum_sold_qty 
                 from fact_sales_item fsi, dim_invn_item dii, dim_store ds 
              where fsi.item_sid = dii.item_sid and ds.store_no = fsi.store_no  
                       and ds.store_code in (' ||v_store_str_2 || ')   
                         and  dii.upc = 2210003861074  and fsi.qty > 0'
          into v_result;end;
      

  15.   

    呵呵,首先为了把参数转成需要的格式多用了几个函数.其次使用了性能较差的动态sql.直接用instr就可以了.
      

  16.   

    e,不对,如果你这样可以利用索引的话效率比使用instr高.
      

  17.   


    v_store_str 的值是查询出来的,针对每个upc不同,例如是“001|002|085|090|”,或者“001|002|003|004|006|007|008|009|010|011|012|013|014|015|016|017|018|019|020|021|022|025|026|027|028|029|030|031|032|033|034|035|036|037|038|039|040|041|042|043|044|045|046|047|048|049|050|051|052|053|056|057|058|059|060|061|062|063|064|066|068|069|073|074|075|076|077|078|079|080|081|082|083|084|085|086|087|088|090|091|092|095|”的store_code组合,是通过PHP写进来的