两个表 ,一个表存id,另一个表存明细,测试表如下:
tb
P_id number (15)
partmentname varchar(15)
userid varchar(15)
测试数据
1 部门1 1
2 部门2 2,3
3 部门3 4
user
id number(15)
name varchar(15)
age number(3)测试数据
1 zhang 25
2 lisi  29
3 wangwu 48
4 zhaoliu 27select name from user where id in( select userid from tb where P_id=2 )  就不行报错,应该是类型转换的问题,大家帮看一下。

解决方案 »

  1.   

    表名为usert
    SQL> select * from tb;            P_ID PARTMENTNAME    USERID
    ---------------- --------------- ---------------
                   1 部门1           1
                   2 部门2           2,3
                   3 部门3           4SQL> select * from usert;              ID NAME             AGE
    ---------------- --------------- ----
                   1 zhangsan          25
                   2 lisi              49
                   3 wangwu            48
                   4 zhaoliu           27SQL> 
    SQL> select name
      2    from usert
      3   where exists (select 1
      4            from tb
      5           where P_id = 2
      6             and instr(tb.userid, usert.id) > 0)
      7  ;NAME
    ---------------
    lisi
    wangwu
      

  2.   

    应该是使用了关键字导致的,修改成如下试试:
    SELECT "NAME" FROM "USER" WHERE ID IN (SELECT USERID FROM TB WHERE P_ID = 2);
      

  3.   

     
    select name from user where id in( select userid from tb where P_id=2 )  --ora-01722  invalid number用这种方法
    SQL> 
    SQL> select name
      2    from usert
      3   where exists (select 1
      4            from tb
      5           where P_id = 2
      6             and instr(tb.userid, usert.id) > 0)
      7  ;
    P_id=1 可以,可以查到一条记录
    P_id=2 没有记录
      

  4.   

    但实际p_id=2 应该查到两条记录才对啊,而不是没有记录
      

  5.   

    我认为你的的USERID是[2,3]这是作为一个字符出现的,而不是两个
      

  6.   

    select name from user where id in( select userid from tb where P_id=2 ) 
    等于执行 select name from user where id in('2,3')
    执行肯定报错,id是NUMBER  
      

  7.   

      请问你能创建 user 表???
      

  8.   

    select name from user where id in( select to_number(userid) from tb where P_id=2 )  
      

  9.   

      Scott用户下的试题   1、选择部门30中的雇员。
      select * from emp where deptno=30;
    2、列出所有办事员的姓名、编号和部门。“CLERK”
      select ename, empno,d.dname from emp e,dept d where e.deptno = d.deptno and job='CLERK';
    3、找出佣金高于薪金的雇员
     select * from emp where nvl(comm,0)>sal;
    3.1、找出佣金最高的雇员
     select * from (select b.*,rownum r from (select e.* from emp e order by nvl(comm,0) desc) b) where r=1;
    4、找出佣金高于薪金60%的雇员
    select * from emp where nvl(comm,0)>sal*60/100;
    5、找出部门10中所有经理和部门20中所有办事员的详细资料
    select * from emp where (deptno=10 and job='MANAGER') or (deptno =20 and job='CLERK');6、找出部门10中所有经理、部门20中所有办事员以及既不是经理又不是办事员但其薪金大于或等于2000的所有雇员的详细资料
    select * from emp where (deptno=10 and job='MANAGER') or (deptno =20 and job='CLERK')or(job !='MANAGER' and job!='CLERK' and comm>=2000);
    7、找出收取佣金的雇员的不同工作
    select * from emp where comm is not null;
    8、找出不收取佣金或收取的佣金低于100的雇员
    select * from emp where comm is null or comm<100;
    9、找出各月最后一天受雇的所有雇员
    select * from emp where hiredate=last_day(hiredate);
    10、找出早于12年之前受雇的雇员
    select * from emp where months_between(sysdate,hiredate)>=12;
    11、显示只有首字母大写的所有雇员的姓名
    select ename from emp where ename=initcap(ename);
    12、显示正好为15个字符的雇员的姓名
    select * from emp where length(ename)=15;
    13、显示不带有"R"的雇员姓名
     select * from emp where instr(ename,'R')=0;
    14、显示所有雇员的姓名的前三个字符
    select substr(ename,1,4) from emp;
    15、显示所有雇员的姓名,用"a"替换所有的"A"
    select ename,replace(ename,'A','a') from emp;
    16、显示所有雇员的姓名以及满10年服务年限的日期
    select ename,hiredate from emp where months_between(sysdate,hiredate)/12>10;
    17、显示雇员的详细资料,按姓名排序
    select * from emp order by ename;
    18、显示雇员姓名,根据其服务年限,将最老的雇员排在最前面。
     select * from emp order by HIREDATE;
    19、显示所有雇员的姓名、工作和薪金,按工作内的工作的降序顺序排序,而工作按薪金排序
    select ename,job,comm from emp order by job desc,comm;
    20、显示所有雇员的姓名和加入公司的年份和月份,按雇员受雇日所在月排序,并将最前年份的排在最前面
    select ename,hiredate from emp order by extract(year from hiredate),extract(month from hiredate);
    21、显示在一个月为30天的情况下所有雇员的日薪金,忽略余数
    select ename,floor(comm/30) from emp;
    22、找出在(任何年份的)2月受聘的所有雇员
    select * from emp where extract(month from hiredate)=2;
    23、对于每个雇员,显示其加入公司的天数
    select ename,floor(months_between(sysdate,hiredate)*360) from emp;
    24、显示姓名字段的任何位置包含"A"的所有雇员的姓名
    select * from emp where instr(ename,'A')>0;
    25、以年、月和日显示所有雇员的服务年限
    select floor(months_between(sysdate,hiredate)/12)||'年', floor(months_between(sysdate,hiredate))||'月',floor((sysdate-hiredate))||'日'from emp;