我有两个表,一个表的id 是number类型
一个表的id 是varchar类型   但是这里面的值却是相同的我现在想
select  * from a,b where a.id = b.id 这显然报错。
因为一个是number 一个是varchar 请问如何转换呢??、

解决方案 »

  1.   

    把varchar转换成number 吧 to_number
      

  2.   

    把varchar转换成number 吧 to_number(参数)
    相反则用 to_char(参数)
      

  3.   

    楼上正解,另外nunber会自动转换为char,varchar2
      

  4.   

    不会报错,oracle会自动隐式转换,无论使用to_char,to_number或者隐式转换
    在大数据量时,要考虑上述使用了转换无法使用索引而带来性能问题。
      

  5.   


    --还要指定是输出那个表id ,不能直接 就select *
    --转换吧 to_char(),或者to_number吧select a.id,b.col,a.col from a,b where to_char(a.id)= b.id   
      

  6.   

    要转换下:
    select * from a,b where a.id = to_number(b.id);
      

  7.   

    LZ。你说你的那条SQL会报错,你自己试过吗?不要猜,如果不是很清楚,就试验一下比较好
    其实你的sql不会报错的,ORACLE也能把两个表关联上,他会有一个影藏转换的过程而已,其实对于两张差不多表的关联对效率上影响不大;ORACLE隐藏情况下默认情况下能转成NUMBER就转成NUMBER来比较,为了证明这个影藏的操作,可以做一个试验:创建一张表,两个字段,一个NUMBER,一个VARCHAR2(两个字段分别创建索引,如IDX_01在NUMBER字段上,IDX_02在VARCHAR2字段上),两个字段都放入一些数据(FOR循环几百次插入一些数字),两个字段都放入一样的值。
    1、你用一个数字字符串(即带单引号的参数如'123'作为NUMBER字段的WHERE条件)你看下执行计划,它会走创建在NUMBER字段上的索引。2、在用一个数字(不带引号的数字参数如:123 作为VARCHAR2字段的)你再看下执行计划,它不会走在这个VARCHAR2字段上创建的索引,而是走TABLE ACCESS FULL,全表扫描操作,而参数换成'123',就会走索引。为什么?
    推理一下,如果是隐藏转换为VARCHAR2,在第二个试验中,参数应当然默认转换为'123'再比较,那么应当走索引,但是没有,而对于试验一应当由字段转换为VARCHAR2类型,相当于对字段影藏使用TO_CHAR函数,函数将导致索引失效,但是试验一仍然走索引了,索引还是不是影藏转换为VARCHAR2,两个实验都推翻前者。
    你反过来推就全部成立。这里扯得有点远,不过那个SQL是不会报错的,楼主可以先做下是实验再说
      

  8.   


    修正下,虽然和话题关系不大,推理部分有点乱,也有点写错了,有限转换TO_NUMBER才对,写成TO_CHAR了。从新推理下:1、首先定位:VARCHAR2和NUMBER默认情况下一个是字符,一个是NUMBER肯定不能比较大小,ORACLE可以让他们比较,那么必然ORACLE做了一个影藏转换,那么TO_NUMBER和TO_CHAR谁更高还是有时机的,根据上面两个实验(LZ可以自己做这样的实验试一试),可以说明:2、根据试验一,在带有索引的NUMBER的字段中,与一个数字字符串比较,会走索引,那么一个很大的可能性就是字段没有被转换,如果字段呗转换相当于字段经历了一个影藏的TO_CHAR,那么就是函数,在没有建立函数索引的情况下,是不会走索引的,这与事实相违背,它走索引了,说明字段很大可能没有转换,而是转换的传入的参数将其TO_NUMBER了一下。3、根据实验二,在带有索引的VARCHAR2字段中,与一个数字比较,不走索引,那么字段多半被函数转换了,经历了一个影藏的TO_NUMBER,这样才会导致不走索引,因为此时如果传入字符串(即和字段同类型),肯定会走索引,现在没有,再次证明TO_NUMBER的过程。虽然试验有一些极端,而且不能完全说明问题,但是在我参与的项目应用中都是成立的,当然对于表连接例外,这涉及一些其它的东东;至于同种类型的比较如果是在单个查询条件下,大部分情况都是会走索引的。
      

  9.   

    oracle会自动隐式转换,无论使用to_char,to_number或者隐式转换
    另外:
    把varchar转换成number : to_number(参数)
    例:select * from a,b where a.id = to_number(b.id);
    相反则用 to_char(参数)
    例:select * from a,b where to_char(a.id)= b.id  ;
      

  10.   


    SQL> create table tb1(id number,col1 varchar2(10));Table created.SQL> create table tb2(id varchar2(5),col1 varchar(10));Table created.SQL> insert into tb1(id, col1) values( 1,'A');1 row created.SQL> insert into tb1(id,col1) values(2,'B');1 row created.SQL> insert into tb2(id,col1) values(1,'AA');1 row created.SQL> insert into tb2(id,col1) values(2,'BB'); 1 row created.SQL> select * from tb1,tb2 where tb1.id = tb2.id;        ID COL1       ID    COL1
    ---------- ---------- ----- ----------
             1 A          1     AA
             2 B          2     BB--也可以实现显示转换 
    SQL> select * from tb1,tb2 where to_char(tb1.id) = tb2.id;        ID COL1       ID    COL1
    ---------- ---------- ----- ----------
             1 A          1     AA
             2 B          2     BB
      

  11.   

    不会报错 oracle可以自动转换的
      

  12.   

    sql 可以用语句查询直接转换的select convert(varchar(10),number)
    from tabel_name也可以这么写
    select cast(number as varchar)
    from table_name本来是数字类型的 这样查出来的结果就直接转换成字符型了