我有两个表,一个表的id 是number类型
一个表的id 是varchar类型 但是这里面的值却是相同的我现在想
select * from a,b where a.id = b.id 这显然报错。
因为一个是number 一个是varchar 请问如何转换呢??、
一个表的id 是varchar类型 但是这里面的值却是相同的我现在想
select * from a,b where a.id = b.id 这显然报错。
因为一个是number 一个是varchar 请问如何转换呢??、
解决方案 »
- oracle存储过程如何写
- Oracle Net Configuration Assistant 失败(急!!!!!!)
- 很诡异的一个错误: numeric or value error: character string buffer too small?
- Oracle10g 数据库状态当前不可用 启动 执行回复
- 大家帮忙,请给我提供一个注册思路(编个软件不容易,轻易被人Fee Copy,感觉不爽)
- 请问在oracle中写存储过程时,遇到两个单引号时该怎样写?
- 如实现像MSSQL的IDENTITY(1,1)数据类型. 并在数据集提交时,能自动插入值?
- 如何在oracle8.17中加入Java程序
- 请教各位高手,这个触发器怎么写???
- mysql获取一段时间
- 根据一张表更新另外一张表的相关字段,求教各位?oracle 10g DataBase
- jdbc更新成功返回某列的值
相反则用 to_char(参数)
在大数据量时,要考虑上述使用了转换无法使用索引而带来性能问题。
--还要指定是输出那个表id ,不能直接 就select *
--转换吧 to_char(),或者to_number吧select a.id,b.col,a.col from a,b where to_char(a.id)= b.id
select * from a,b where a.id = to_number(b.id);
其实你的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是不会报错的,楼主可以先做下是实验再说
修正下,虽然和话题关系不大,推理部分有点乱,也有点写错了,有限转换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的过程。虽然试验有一些极端,而且不能完全说明问题,但是在我参与的项目应用中都是成立的,当然对于表连接例外,这涉及一些其它的东东;至于同种类型的比较如果是在单个查询条件下,大部分情况都是会走索引的。
另外:
把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 ;
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
from tabel_name也可以这么写
select cast(number as varchar)
from table_name本来是数字类型的 这样查出来的结果就直接转换成字符型了