各位:
select catalognodecode from originalmanagesetting
catalognodecode 是('ucls20031112200619281475','ucls20031112200200640475','ucls20090218133927812475','ucls20081211090531734475','ucls20080904140301625475','ucls20080904134307406475','ucls20050711164414421475','ucls20041021154758968475','ucls20041021154620859475','ucls20041021154457296475','ucls20041021154320265475','ucls20041021154127703475','ucls20041021153522375475','ucls20040707111157424475','ucls20040523092057860475','ucls20031125121225968475',)的一个字段select * from classnode where nodecode in(
'ucls20031112200619281475','ucls20031112200200640475','ucls20090218133927812475','ucls20081211090531734475','ucls20080904140301625475','ucls20080904134307406475','ucls20050711164414421475','ucls20041021154758968475','ucls20041021154620859475','ucls20041021154457296475','ucls20041021154320265475','ucls20041021154127703475','ucls20041021153522375475','ucls20040707111157424475','ucls20040523092057860475','ucls20031125121225968475')可以查到结果.
为什么
select * from classnode where nodecode in
(select substr(catalognodecode,1,length(catalognodecode)-1) from originalmanagesetting)
查不到结果????
急~~~~~~~~~!!

解决方案 »

  1.   

    你看看 substr(catalognodecode,1,length(catalognodecode)-1)这样堆出来的结果是什么,有没有空格之类的。
      

  2.   

    明白你的意思了
    select * from classnode where nodecode in 
    (select substr(catalognodecode,1,length(catalognodecode)-1) from originalmanagesetting) 
    和你的第一个sql并不一样,第一个是从括号内很多字符串内寻找匹配记录,而第二个是把那些字符串做为一个大串去匹配的,所以第二个查不出来比如我把你的串简化为('a','b')
    第一个sql相当于匹配a和b两个字符串
    第二个sql相当于去匹配('a','b')这个字符串
      

  3.   

    问题是这样的(superhsj)有什么解决办法吗?
      

  4.   


    不是吧,第一句与第二句不同是因为 一个是从固定的字符串中in,第二个是利用了子查询。你可以这样查询一下
    select * from classnode a, originalmanagesetting b
    where a.nodecode=b.substr(catalognodecode,1,length(catalognodecode)-1);
    看看是否有记录,我觉得还是没有匹配的结果
    而且如果这两个表数据量很大,可以用exists来替换掉in
    select * from classnode
    where exists (select * from originalmanagesetting where nodecode = substr(catalognodecode,1,length(catalognodecode)-1)) 
    这样可能效率会高一点
      

  5.   

    用pl/sql
    declare
    v_char varchar2(1000);
    begin
    select substr(catalognodecode,1,length(catalognodecode)-1) into v_char from originalmanagesetting;
    execute immediate 'select * from classnode where instr('v_char',nodecode)>0';
    end;
    如果你想获取查询结果的话可能会用到游标 
      

  6.   

    回6楼zxf_feng 
    你可能没看清楚题目,他是把那一大长串存到一个字段里了,用in肯定不能匹配
      

  7.   

    那就用游标
    create or replace package RefCursor is   
     type t_RefCursor is ref cursor;  
    end RefCursor;CREATE OR REPLACE FUNCTION test return RefCursor.t_Refcursor is
    v_cur RefCursor.t_Refcursor;  
    v_sql varchar2(4000); 
    v_char varchar2(1000); 
    begin 
    select substr(catalognodecode,1,length(catalognodecode)-1) into v_char from originalmanagesetting; 
    v_sql:= 'select * from classnode where instr('v_char',nodecode)>0'; 
    open v_cur for v_sql;
    --后面自己写了
    end; 
      

  8.   

    create or replace package RefCursor is   
     type t_RefCursor is ref cursor;  
    end RefCursor;CREATE OR REPLACE FUNCTION test return RefCursor.t_Refcursor is
    v_cur RefCursor.t_Refcursor;  
    v_sql varchar2(4000); 
    v_char varchar2(1000); 
    begin 
    select substr(catalognodecode,1,length(catalognodecode)-1) into v_char from originalmanagesetting; 
    v_sql:= 'select * from classnode where instr('||v_char||',nodecode)>0'; 
    open v_cur for v_sql;
    --后面自己写了
    end; 
      

  9.   

    不用pl/sql
    原来的是
    ('ucls20031112200619281475','ucls20031112200200640475'......,)多了一个','
    截取查出来的是
    ('ucls20031112200619281475','ucls20031112200200640475'......)
    它作为一个字符串,现在怎样把它弄成('a','b')这中形式的枚举啊???
      

  10.   

    这个不用pl/sql的话,我也不知道怎么弄
    或者简单点你可以用上面的pl/sql建一个视图,然后select * from 视图
    我能想到的只能这样了
      

  11.   

    select * from ttt1 a
    where instr((select code from ttt1 b where code='100103'),a.code)>0如果你能保证select substr(catalognodecode,1,length(catalognodecode)-1) from originalmanagesettin 通过某个条件能返回单条可以像上面那样写,否则就得像 superhsj 所说的那样用游标来输出。还要也可以先将这个表进行行列转换,然后通过中间表的方式用in来实现查询