sql语句中如何把number类型转换成varchar2类型

sforat 2010-05-07 12:12:26
我有两个表,一个表的id 是number类型
一个表的id 是varchar类型 但是这里面的值却是相同的

我现在想
select * from a,b where a.id = b.id 这显然报错。
因为一个是number 一个是varchar 请问如何转换呢??、
...全文
46174 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
shadowlegend007 2012-10-19
  • 打赏
  • 举报
回复
sql 可以用语句查询直接转换的

select convert(varchar(10),number)
from tabel_name

也可以这么写
select cast(number as varchar)
from table_name

本来是数字类型的 这样查出来的结果就直接转换成字符型了
duqiangcise 2010-05-08
  • 打赏
  • 举报
回复
to_char()或to_number()
siakang 2010-05-08
  • 打赏
  • 举报
回复
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 ;
Adebayor 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 sforat 的回复:]
我有两个表,一个表的id 是number类型
一个表的id 是varchar类型 但是这里面的值却是相同的

我现在想
select * from a,b where a.id = b.id 这显然报错。
因为一个是number 一个是varchar 请问如何转换呢??、
[/Quote]
不会报错 oracle可以自动转换的
Leshami 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tangren 的回复:]

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

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
kejian1986 2010-05-07
  • 打赏
  • 举报
回复
楼上正解,另外nunber会自动转换为char,varchar2
xiaofirehu 2010-05-07
  • 打赏
  • 举报
回复
把varchar转换成number 吧 to_number(参数)
相反则用 to_char(参数)
iihero_ 2010-05-07
  • 打赏
  • 举报
回复
把varchar转换成number 吧 to_number
xieyu_zy 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xieyuooo 的回复:]
LZ。你说你的那条SQL会报错,你自己试过吗?不要猜,如果不是很清楚,就试验一下比较好。。。
其实你的sql不会报错的,ORACLE也能把两个表关联上,他会有一个影藏转换的过程而已,其实对于两张差不多表的关联对效率上影响不大;

ORACLE隐藏情况下默认情况下能转成NUMBER就转成NUMBER来比较,为了证明这个影藏的操作,可以做一个试验:

创建一张表,两个字段,一个NUMBER,……
[/Quote]

修正下,虽然和话题关系不大,推理部分有点乱,也有点写错了,有限转换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的过程。

虽然试验有一些极端,而且不能完全说明问题,但是在我参与的项目应用中都是成立的,当然对于表连接例外,这涉及一些其它的东东;至于同种类型的比较如果是在单个查询条件下,大部分情况都是会走索引的。
xieyu_zy 2010-05-07
  • 打赏
  • 举报
回复
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是不会报错的,楼主可以先做下是实验再说。。。
zjwssg 2010-05-07
  • 打赏
  • 举报
回复
要转换下:
select * from a,b where a.id = to_number(b.id);
心中的彩虹 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 sforat 的回复:]
我有两个表,一个表的id 是number类型
一个表的id 是varchar类型 但是这里面的值却是相同的

我现在想
select * from a,b where a.id = b.id 这显然报错。
因为一个是number 一个是varchar 请问如何转换呢??、
[/Quote]

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

select a.id,b.col,a.col from a,b where to_char(a.id)= b.id
tangren 2010-05-07
  • 打赏
  • 举报
回复
不会报错,oracle会自动隐式转换,无论使用to_char,to_number或者隐式转换
在大数据量时,要考虑上述使用了转换无法使用索引而带来性能问题。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧