1、需要用到两个字符类函数instr和substr,具体用法介绍如下:
专注于为中小企业提供网站建设、做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业韶山免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
函数:字符定位函数
instr
语法:instr(待处理的字符串,需要查找的字符,开始查找的起始位置,第n次出现)
返回值:字母所在的位置,没有返回
0;
函数:字符定位函数
substr
语法:substr('要切割的值',从第几个位置开始切割,切割几位);
返回值:截取的字符串。
2、该题实现步骤,以字段a内容为'武汉一一科技公司(2009年2月注销)'为例:
第一步:先从字段a的字段第一个字符往前找左括号'('
第一次出现的位置,如下:
select
instr('武汉一一科技公司(2009年2月注销)',
'(',
1,
1)
--
9
from
dual;
第二步:从字段第一个字符开始,一直找出左括号'('的前一位就行,如下:
select
substr('武汉一一科技公司(2009年2月注销)',
1,
instr('武汉一一科技公司(2009年2月注销)',
'(',
1,
1)
-
1)
from
dual;
注:如果某某公司名称本身可能含有括号的话,建议从最后一个字符倒着往回找左括号出现第一次的位置,即
select
instr('武汉一一科技公司(2009年2月注销)',
'(',
-1,
1)
--
9
from
dual;
3、最终答案
select
select
substr(a,
1,
instr(a,
'(',
-1,
1)
-
1)
from
table
;
没看懂你的抽取50%是什么意思,可以参考如下方案:
1:随机抽取前50条记录:
select *
from (select * from scott.emp order by dbms_random.random)
where rownum 51
2:随机取1~100之间的数据:
select dbms_random.value(1,100) from dual
select col1,col2,type
from (select col1,col2,type,rn,max() over(partitio by type) as rn_max
from (select col1,col2,type,row_number() over (paritition by type order by dbms_random.value) as rn
from tablename ) t
) p
where rn/rn_max=0.1
;
sample不确定能不能用分析函数,但是主要是用来全表取sample的
VALUE 函数的第一种形式返回一个大于或等于 0 且小于 1 的随机数;第二种形式返回一个大于或等于 LOW ,小于 HIGH 的随机数。下面是其用法的一个示例:
SQL select dbms_random.value, dbms_random.value(0,18) from dual;
VALUE DBMS_RANDOM.VALUE(0,18)
---------- -----------------------
0.05863200 12.9840987851451
--如果员工月度业务单小于3条的员工和部门
select * from talbe_name where 员工 in(
select 部门,员工,count(1) from table_name
where 结单时间开始时间
and 结单时间结束时间
group by 部门,员工
having count(1)3)
and 结单时间开始时间
and 结单时间结束时间;
--如果员工月度业务单大于3条的员工,随机抽取3条单子
select * from
(select t.*,rownum from talbe_name where 员工 in(
select 部门,员工,count(1) from table_name
where 结单时间开始时间
and 结单时间结束时间
group by 部门,员工
having count(1)3)
and 结单时间开始时间
and 结单时间结束时间
order by dbms_random.value)
where rownum3;