截取字段的数据

liuyjcel 2011-04-02 10:26:38
表TAble的字段如下:
name
基价:60
基价:310-折扣:1.00000000
基价:6620
基价:120-折扣:1.00000000

怎么才可以只取“基价:”后,“-折扣” 前,这部分数据?
...全文
163 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bai_jiong 2011-04-07
  • 打赏
  • 举报
回复
select regexp_substr(name,'^$','[0-9]+',1,1) from table_name;

应改为:
select regexp_substr(name,'[0-9]+',1,1) from table_name;

感谢各位提醒
hd1986 2011-04-05
  • 打赏
  • 举报
回复
LZ看这个,这个可以!!!!!!!!!!!!

select substr(
name,
instr(name,':')+1,
decode(instr(name,'-zhekou'),0,100,instr(name,'-zhekou'))-instr(name,':')-1
)
from test2;
liuyyuns 2011-04-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bai_jiong 的回复:]
如果使用的数据库为10G或以上,还可以使用以下的SQL语句:
select regexp_substr(name,'^$','[0-9]+',1,1) from table_name;
[/Quote]
我的是oracle10.2.0.3.0的版本,执行该语句出错:

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
Connected as ccpph1

SQL> select regexp_substr(name,'^$','[0-9]+',1,1) from t;

select regexp_substr(name,'^$','[0-9]+',1,1) from t

ORA-01722: 无效数字
liuyyuns 2011-04-05
  • 打赏
  • 举报
回复

select name,substr(name,instr(name,'基价:')+length('基价:'),decode(instr(name,'折扣:'),0,length(name)-length('基价:'),instr(name,'-折扣:')-length('基价:')-instr(name,'基价:'))) from t;
doer_ljy 2011-04-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bai_jiong 的回复:]

如果使用的数据库为10G或以上,还可以使用以下的SQL语句:
select regexp_substr(name,'^$','[0-9]+',1,1) from table_name;
[/Quote]
你不解释一下为什么吗?
哈哈
有误导嫌疑
bai_jiong 2011-04-03
  • 打赏
  • 举报
回复
如果使用的数据库为10G或以上,还可以使用以下的SQL语句:
select regexp_substr(name,'^$','[0-9]+',1,1) from table_name;
luoyoumou 2011-04-03
  • 打赏
  • 举报
回复
drop table t purge;
create table t(name varchar2(100));
insert into t(name) values('基价:60');
insert into t(name) values('基价:310-折扣:1.00000000');
insert into t(name) values('基价:6620');
insert into t(name) values('基价:120-折扣:1.00000000');
commit;

-- 要不这样:
col name for a25;
col sub_name for a25;
select name,
substr(name, instr(name,'基价:')+length('基价:'),
decode(instr(name,'-折扣'),0,length(name),instr(name,'-折扣')-instr(name,'基价:')-length('基价:'))) as sub_name
from t;


-- 或者这样:
col name for a25;
col sub_name for a25;
select name,
substr(name, instr(name,'基价:')+length('基价:'),
instr(name||'-折扣','-折扣')-instr(name,'基价:')-length('基价:') ) as sub_name
from t;
luoyoumou 2011-04-02
  • 打赏
  • 举报
回复
drop table t purge;
create table t(name varchar2(100));
insert into t(name) values('基价:60');
insert into t(name) values('基价:310-折扣:1.00000000');
insert into t(name) values('基价:6620');
insert into t(name) values('基价:120-折扣:1.00000000');
commit;

col name for a25;
col sub_name for a25;
select name,
substr(name, instr(name,'基价:')+length('基价:'),
decode(instr(name,'-折扣'),0,length(name),instr(name,'-折扣')-instr(name,'基价:')-length('基价:'))) as sub_name
from t;
luoyoumou 2011-04-02
  • 打赏
  • 举报
回复
eygle@SZTYORA> create table t(name varchar2(100));

表已创建。

eygle@SZTYORA> insert into t(name) values('基价:60');

已创建 1 行。

eygle@SZTYORA> insert into t(name) values('基价:310-折扣:1.00000000');

已创建 1 行。

eygle@SZTYORA> insert into t(name) values('基价:6620');

已创建 1 行。

eygle@SZTYORA> insert into t(name) values('基价:120-折扣:1.00000000');

已创建 1 行。

eygle@SZTYORA> commit;

提交完成。

eygle@SZTYORA>
eygle@SZTYORA> col name for a25;
eygle@SZTYORA> col sub_name for a25;
eygle@SZTYORA> select name,
2 substr(name, instr(name,'基价:')+length('基价:'),
3 decode(instr(name,'-折扣'),0,length(name),instr(name,'-折扣')-instr(name,'基价:')-length('基价:'))) as sub_name
4 from t;

NAME SUB_NAME
------------------------- -------------------------
基价:60 60
基价:310-折扣:1.00000000 310
基价:6620 6620
基价:120-折扣:1.00000000 120
dawugui 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liuyjcel 的回复:]
引用 1 楼 zftang 的回复:
SELECT substr(name,INSTR(name,1,'基价')+2,instr(name,1,'-折扣')-INSTR(name,1,'基价')) from 表


这样下面部分的数据就得不到了。
name
基价:60
基价:6620
[/Quote]
SELECT substr(name,INSTR(name,1,'基价')+2,instr(name,1,'-折扣')-INSTR(name,1,'基价')) from 表
union all
select name from 表 where INSTR(name,1,'折扣') = 0
秋雨飘落 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liuyjcel 的回复:]
引用 1 楼 zftang 的回复:
SELECT substr(name,INSTR(name,1,'基价')+2,instr(name,1,'-折扣')-INSTR(name,1,'基价')) from 表


这样下面部分的数据就得不到了。
name
基价:60
基价:6620
[/Quote]

再加一个UNION ALL 对这部分数据进来单独读取

union all

select substr(name ,instr(name,1,'基价')+2,100) from biao where 没有折扣的数据
liuyjcel 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zftang 的回复:]
SELECT substr(name,INSTR(name,1,'基价')+2,instr(name,1,'-折扣')-INSTR(name,1,'基价')) from 表
[/Quote]

这样下面部分的数据就得不到了。
name
基价:60
基价:6620
秋雨飘落 2011-04-02
  • 打赏
  • 举报
回复
name
基价:60
基价:310-折扣:1.00000000
基价:6620
基价:120-折扣:1.00000000

怎么才可以只取“基价:”后,“-折扣” 前,这部分数据?

SELECT substr(name,INSTR(name,1,'基价')+2,instr(name,1,'-折扣')-INSTR(name,1,'基价')) from 表
我TM真的是猪 2011-04-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zftang 的回复:]

引用 2 楼 liuyjcel 的回复:
引用 1 楼 zftang 的回复:
SELECT substr(name,INSTR(name,1,'基价')+2,instr(name,1,'-折扣')-INSTR(name,1,'基价')) from 表


这样下面部分的数据就得不到了。
name
基价:60
基价:6620


再加一个UNION ALL 对这部分数据进来……
[/Quote]
学习学习。。。这两天我也在为数据库操作的问题苦恼!

17,377

社区成员

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

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