实现其它进制到十进制转换,内置函数
分类:高并发

注:

问:怎样实现ORACLE中用一条SQL实现其它进制到十进制的转换?

  1. wm_concat函数也来打擂台
    使用场景:简单的将一列的字段通过逗号连接起来。
    Example:
    select a1,(wm_concat(b1),from aa group by a1
    如果是10G版本以下通用的语句如下
    SELECT t.id id, MAX(substr(sys_connect_by_path(t.sname, ','), 2)) str
    FROM (SELECT id, sname, row_number() over(PARTITION BY id ORDER BY sname) rn FROM a) t
    START WITH rn = 1
    CONNECT BY rn = PRIOR rn + 1
    AND id = PRIOR id
    GROUP BY t.id;

三. 字符函数(可用于字面字符或数据库列)

对其它进制可以根据例子将power的底数改成相应的进制就可以了。

答:具体示例如下:

2.帝王之作(Sql语句中实现字段的自动增长。)
Example(实现了日期的自动增长):
select to_char(sysdate+rownum,'mm-dd')
from dual connect by rownum <=7

1,字符串截取
select substr('abcdef',1,3) from dual

本文只是一个例子,大家可以把它封装成一个通用函数进行实用。

-----二进制转换十进制-----------------
select sum(data1)
from (select substr('1101', rownum, 1) * power
(2, length('1101') - rownum) data1
from dual
connect by rownum <= length('1101'))

3.还是你最亲(csdn的兄弟们最喜欢用的虚表)
Example:
with tab as
(
select 1
  from dual
union all
select 2 from dual
)

2,查找子串位置
select instr('abcfdgfdhd','fd') from dual

大家在试的时候将里面相应的其它进制的数值换成自己的数据就可以了。

-----八进制转换十进制-----------------
select sum(data1)
from (select substr('1101', rownum, 1) * power
(8, length('1101') - rownum) data1
from dual
connect by rownum <= length('1101'))

  1. 还真另类(将所有列使用'||'拼接后插入一个clob字段)
    insert into t_result(clob_col) select F_TASK_NAME||F_CREATER_NAME
    ||f_result from dual;
    5.选择性插入语句,很实用
    INSERT ALL
      WHEN type=1 THEN INTO tab1 VALUES (myseq.NEXTVAL, val)
      WHEN type=2 THEN INTO tab2 VALUES (myseq.NEXTVAL, val)
      WHEN type IN (3,4,5) THEN INTO tab3 VALUES (myseq.NEXTVAL, val)
      ELSE INTO tab4 VALUES (myseq.NEXTVAL, val)
    SELECT type, val FROM source_tab;
    6.这都被你给删了(删除数据重复的记录)
    delete from a a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);
    7.的确很美,嫁了吧(美妙的数据更新语句,前提是主键相同)
    update (select s.name name1,s2.name name2 from simple s,simple2 s2 where s.id=s2.id) v set v.name1=v.name2;
    8.选择由你(针对同一数据表是选择插入,还是更新)
    merge  into  a  using  b  on  (a.USER_NO=b.USER_NO) 
      when  matched  then  update  set  a.NAME=b.NAME 
      when  not  matched  then    insert  values  (b.USER_NO,b.NAME)
    9.Java爱好者(通用的oracle分页语句)
    SELECT * FROM ( SELECT row_.*, rownum rownum_ FROM (
    //生成标准的查询语句(没有分页条件的)
    Sql_statement
    ) row_ WHERE rownum <=  pageSize * pageNumber

3,字符串连接
select 'HELLO'||'hello world' from dual;

-----二进制转换十进制-----------------

-----十六进制转换十进制-----------------
select sum(data1)
from (select (CASE upper(substr('2D', rownum, 1))
WHEN 'A' THEN '10'
WHEN 'B' THEN '11'
WHEN 'C' THEN '12'
WHEN 'D' THEN '13'
WHEN 'E' THEN '14'
WHEN 'F' THEN '15'
ELSE substr('2D', rownum, 1)
END) * power(16, length('2D') - rownum) data1
from dual
connect by rownum <= length('2D'))

) WHERE rownum_ > pageSize * (pageNumber - 1))
10.让我也来个(使用频率高的查询连续记录)
Example(查询连续3个月的记录):
select id from (select id,sbrq,sbbz,
add_months(trunc(sbrq, 'mm'),
  1 - rank() over(partition by id order by sbrq)) ord
  from (select id, sbrq, sbbz from gl_wsbxx where sbbz = 'N'))
  group by id, ord
having count(*) >= 3
11.随机函数也疯狂
Example:
sys_guid() 获取随机字符串。
dbms_random.value()获取随机数
select * from consume SAMPLE(10) where rownum <2;
SELECT * FROM (SELECT * FROM t ORDER BY sys_guid()) WHERE rownum < 2;这个的效率高些
select * from tb order by dbms_random.value()

4, 1)去掉字符串中的空格
select ltrim(' abc') s1,
rtrim('zhang ') s2,
trim(' zhang ') s3 from dual
2)去掉前导和后缀
select trim(leading 9 from 9998767999) s1,
trim(trailing 9 from 9998767999) s2,
trim(9 from 9998767999) s3 from dual;

select sum(data1) from (select substr("1101", rownum, 1) * power(2, length("1101") - rownum) data1 from dual connect by rownum = length("1101"))

注释:

12.这个选择性删除记录也很拽
Example:
create or replace trigger tt_del_tri
  before delete on tb_Group when(old.groupName = 'system')
declare
  raise_application_error(-20000,'不能删除系统名字的列');
begin
阻止删除数据列。。。
13.不老的Kill语句
一  如何查oracle的锁
SELECT /*+ rule */ s.username,decode(l.type,'TM','TABLE LOCK','TX','ROW LOCK',NULL)
LOCK_LEVEL,o.owner,o.object_name,o.object_type,     
    s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
    FROM v$session s,v$lock l,dba_objects o
    WHERE l.sid = s.sid
    AND l.id1 = o.object_id(+)
    AND s.username is NOT NULL
二  如何杀掉锁的进程
    Alter system kill session 'sid,serial#'
    alter system disconnect session 'sid,serial#' immediate;
    在win上,还可以采用oracle提供的orakill杀掉一个线程(其实就是一个Oracle进程)
    在Linux/Unix上,可以直接利用kill杀掉数据库进程对应的OS进程
14.正则表达式也想小试牛刀
Example(regexp_substr,regexp_instr,regexp_like,regexp_replace):
SQL> select REGEXP_REPLACE('李四(AAA)','(.+)((.+)','1') from dual;

5,返回字符串首字母的Ascii值
select ascii('a') from dual

-----八进制转换十进制-----------------

对其它进制可以根据例子将power的底数改成相应的进制就可以了。

REGEXP_REPLACE('李四(AAA)','(.

李四

SQL>

  1. translate函数也来指招
    Example(将a用w代替,b用e代替):
    select translate('abcdef','ab','we') from dual;

6,返回ascii值对应的字母
select chr(97) from dual

select sum(data1) from (select substr("1101", rownum, 1) * power(8, length("1101") - rownum) data1 from dual connect by rownum = length("1101"))

本文只是一个例子,大家可以把它封装成一个通用函数进行实用。

7,计算字符串长度
select length('abcdef') from dual

-----十六进制转换十进制-----------------

大家在试的时候将里面相应的其它进制的数值换成自己的数据就可以了(有多处)。

8,initcap(首字母变大写) ,lower(变小写),upper(变大写)
select lower('ABC') s1,
upper('def') s2,
initcap('efg') s3
from dual;

select sum(data1) from (select (CASE upper(substr("2D", rownum, 1)) WHEN "A" THEN "10" WHEN "B" THEN "11" WHEN "C" THEN "12" WHEN "D" THEN "13" WHEN "E" THEN "14" WHEN "F" THEN "15" ELSE substr("2D", rownum, 1) END) * power(16, length("2D") - rownum) data1 from dual connect by rownum = length("2D"))

来源:赛迪网 作者:han

9,Replace
select replace('abc','b','xy') from dual;

10,translate
select translate('abc','b','xx') from dual; -- x是1位

11,lpad [左添充] rpad [右填充](用于控制输出格式)
select lpad('func',15,'=') s1, rpad('func',15,'-') s2 from dual;
select lpad(dname,14,'=') from dept;

12, decode[实现if ..then 逻辑] 注:第一个是表达式,最后一个是不满足任何一个条件的值
select deptno,decode(deptno,10,'1',20,'2',30,'3','其他') from dept;
例:
select seed,account_name,decode(seed,111,1000,200,2000,0) from t_userInfo//如果seed为111,则取1000;为200,取2000;其它取0
select seed,account_name,decode(sign(seed-111),1,'big seed',-1,'little seed','equal seed') from t_userInfo//如果seed>111,则显示大;为200,则显示小;其它则显

示相等

13 case[实现switch ..case 逻辑]
SELECT CASE X-FIELD
WHEN X-FIELD < 40 THEN 'X-FIELD 小于 40'
WHEN X-FIELD < 50 THEN 'X-FIELD 小于 50'
WHEN X-FIELD < 60 THEN 'X-FIELD 小于 60'
ELSE 'UNBEKNOWN'
END
FROM DUAL

注:CASE语句在处理类似问题就显得非常灵活。当只是需要匹配少量数值时,用Decode更为简洁。

四.数字函数
1,取整函数(ceil 向上取整,floor 向下取整)
select ceil(66.6) N1,floor(66.6) N2 from dual;

2, 取幂(power) 和 求平方根(sqrt)
select power(3,2) N1,sqrt(9) N2 from dual;

3,求余
select mod(9,5) from dual;

4,返回固定小数位数 (round:四舍五入,trunc:直接截断)
select round(66.667,2) N1,trunc(66.667,2) N2 from dual;

5,返回值的符号(正数返回为1,负数为-1)
select sign(-32),sign(293) from dual;

五.转换函数
1,to_char()[将日期和数字类型转换成字符类型]
1) select to_char(sysdate) s1,
to_char(sysdate,'yyyy-mm-dd') s2,
to_char(sysdate,'yyyy') s3,
to_char(sysdate,'yyyy-mm-dd hh12:mi:ss') s4,
to_char(sysdate, 'hh24:mi:ss') s5,
to_char(sysdate,'DAY') s6
from dual;
2) select sal,to_char(sal,'$99999') n1,to_char(sal,'$99,999') n2 from emp

2, to_date()[将字符类型转换为日期类型]
insert into emp(empno,hiredate) values(8000,to_date('2004-10-10','yyyy-mm-dd'));

3, to_number() 转换为数字类型
select to_number(to_char(sysdate,'hh12')) from dual; //以数字显示的小时数

六.其他函数
1.user:
返回登录的用户名称
select user from dual;

2.vsize:
返回表达式所需的字节数
select vsize('HELLO') from dual;

3.nvl(ex1,ex2):  
ex1值为空则返回ex2,否则返回该值本身ex1(常用)
例:如果雇员没有佣金,将显示0,否则显示佣金
select comm,nvl(comm,0) from emp;

4.nullif(ex1,ex2):
值相等返空,否则返回第一个值
例:如果工资和佣金相等,则显示空,否则显示工资
select nullif(sal,comm),sal,comm from emp;

5.coalesce:  
返回列表中第一个非空表达式
select comm,sal,coalesce(comm,sal,sal*10) from emp;

6.nvl2(ex1,ex2,ex3) :
如果ex1不为空,显示ex2,否则显示ex3
如:查看有佣金的雇员姓名以及他们的佣金
  select nvl2(comm,ename,') as HaveCommName,comm from emp;

七.分组函数
max min avg count sum
1,整个结果集是一个组
1) 求部门30 的最高工资,最低工资,平均工资,总人数,有工作的人数,工种数量及工资总和
select max(ename),max(sal),
min(ename),min(sal),
avg(sal),
count(*) ,count(job),count(distinct(job)) ,
sum(sal) from emp where deptno=30;
2, 带group by 和 having 的分组
1)按部门分组求最高工资,最低工资,总人数,有工作的人数,工种数量及工资总和
select deptno, max(ename),max(sal),
min(ename),min(sal),
avg(sal),
count(*) ,count(job),count(distinct(job)) ,
sum(sal) from emp group by deptno;

2)部门30的最高工资,最低工资,总人数,有工作的人数,工种数量及工资总和
select deptno, max(ename),max(sal),
min(ename),min(sal),
avg(sal),
count(*) ,count(job),count(distinct(job)) ,
sum(sal) from emp group by deptno having deptno=30;

3, stddev 返回一组值的标准偏差
select deptno,stddev(sal) from emp group by deptno;
variance 返回一组值的方差差
select deptno,variance(sal) from emp group by deptno;

4, 带有rollup和cube操作符的Group By
rollup 按分组的第一个列进行统计和最后的小计
cube 按分组的所有列的进行统计和最后的小计
select deptno,job ,sum(sal) from emp group by deptno,job;
select deptno,job ,sum(sal) from emp group by rollup(deptno,job);
cube 产生组内所有列的统计和最后的小计
select deptno,job ,sum(sal) from emp group by cube(deptno,job);

八、临时表
只在会话期间或在事务处理期间存在的表.
临时表在插入数据时,动态分配空间
create global temporary table temp_dept
(dno number,
dname varchar2(10))
on commit delete rows;
insert into temp_dept values(10,'ABC');
commit;
select * from temp_dept; --无数据显示,数据自动清除
on commit preserve rows:在会话期间表一直可以存在(保留数据)
on commit delete rows:事务结束清除数据(在事务结束时自动删除表的数据)

本文由10bet手机官网发布于高并发,转载请注明出处:实现其它进制到十进制转换,内置函数

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文