Oracle基本函数即字段拆分
--创建用户 CREATE USER jim IDENTIFIED BY changeit;--给用户赋登陆连接权限 GRANT CONNECT TO jim;--给用户赋资源权限 GRANT RESOURCE TO jim;--回收登陆权限 REVOKE CONNECT FROM jim;--回收资源操作权限 REVOKE RESOURCE FROM jim;--锁定用户 ALTER USER jim ACCOUNT LOCK;--给用户解锁 ALTER USER jim ACCOUNT UNLOCK;--给用户修改密码 ALTER USER jim IDENTIFIED BY changeit;--创建时间维度表 CREATE TABLE DIM_DATE(Date_ID char(8) primary key , --20160704Date_Name date, --2016/7/4Year number, --2016Year_Half char(6), --2016H2Year_Month char(6), --201607Year_Quarter char(6),-- 2016Q3Half_Number number,--2Half_Name char(2), --H2Quarter_Number number,--3Quarter_Name char(2),--Q3Month_Number number,--7Month_Name nvarchar2(20),--JUNLWeek_Number number, --2Week_Name nvarchar2(20),--MondayCreat_Date date, --创建时间Update_Date date) --更新时间 ;--测试选出一段时间select to_date('2014-01-01','YYYY-MM-DD')+(rownum-1) from dual connect by rownum<=(to_date('2015-01-01','YYYY-MM-DD')-to_date('2014-01-01','YYYY-MM-DD'));with temp_date as (select to_date('2014-01-01','YYYY-MM-DD')+(rownum-1) from dual connect by rownum<=(to_date('2015-01-01','YYYY-MM-DD')-to_date('2014-01-01','YYYY-MM-DD')))select * from temp_date;--创建存储过程,导入时间CREATE OR REPLACE PROCEDURE SP_ADD_DATEASv_Half number;v_Quarter number;v_Month DIM_Date.Month_Name%type;v_Month_Number number;CURSOR c_date ISSELECT Date_ID,DIM_Date.Date_Name FROM DIM_DATE;c_row c_date%rowtype;BEGINMERGE INTO DIM_DATE T1USING(select to_date('2014-01-01','YYYY-MM-DD')+(rownum-1) date_name from dual connect by rownum<=(to_date('2018-01-01','YYYY-MM-DD')-to_date('2014-01-01','YYYY-MM-DD')) ) temp_Dateon (t1.date_name=temp_Date.date_name)when matched thenupdate set t1.date_id=to_char(temp_Date.date_name,'YYYYMMDD')when not matched theninsert (Date_ID) values(to_char(temp_Date.date_name,'YYYYMMDD'));--循环游标FOR c_row in c_date loopv_Month_Number:=to_number(to_char(c_row.Date_Name,'MM'));if v_Month_Number>6 thenv_Half:=2;elsev_Half:=1;end if;update DIM_DATE setDIM_DATE.DATE_NAME=to_date(c_row.Date_ID,'YYYY-MM-DD'),DIM_DATE.HALF_NAME='H'||v_Half --后面在这里补充where DIM_DATE.DATE_ID=c_row.Date_ID;end loop;END;
/*******************华丽的分割线********************/--创建地域维度表CREATE TABLE DIM_Geo(M_CNTY_ID number primary key,M_CNTY nvarchar2(20), --县M_CITY nvarchar2(20), --市M_PRVNC nvarchar2(20)--省 );--创建销售事实表CREATE TABLE SALES_FACT(EMPNO NUMBER(4),DATE_ID char(8),CITY_ID NUMBER,SALES NUMBER);--基于多列的联合主键--此处为empno,date_ID, city_ID共同为一个主键alter table SALES_FACT add constraint PK_SALES_FACT PRIMARY KEY (EMPNO,DATE_ID,CITY_ID);--查询出事实表WITH v1 as (select * from SALES_FACT),v2 as (select * from EMP),v3 as (select * from DIM_DATE),v9 as (select * from DIM_Geo),v6 as (select distinct sales_fact.city_id from sales_fact),v4 as(SELECT v2.ename,v1.date_id,v1.city_id,v1.sales FROM v1 right join v2 on v2.empno=v1.empno),v5 as (select v4.ename,v3.date_id,v4.city_id,v4.sales from v4 partition by (v4.ename)right join v3 on v3.date_id=v4.date_id),v7 as (select v5.ename,v5.date_id,v6.city_id,v5.sales from v5 partition by (ename,date_id)right join v6 on v6.city_id=v5.city_id),v8 as (select v7.ename,v3.Date_ID,v3.Date_Name,v3.Quarter_Name,v3.Quarter_Number,v3.Month_Number,v3.MONTH_NAME,v3.Week_Name,v7.city_id,v7.sales from v7 left join v3on v7.date_id=v3.date_id group by v7.ename,v3.Date_ID,v3.Date_Name,v3.Quarter_Name,v3.Quarter_Number,v3.MONTH_NAME,v3.Month_Number,v3.Week_Name,v7.city_id,v7.sales order by v7.ename,v3.Quarter_Name,v3.Week_Name)select ename,month_name,v9.M_CNTY,v9.M_CITY,v9.M_PRVNC,sum(sales) from v8left join v9 on v8.city_id=v9.M_CNTY_ID WHERE ENAME='ADAMS' GROUP BY ename,month_name,v9.M_CNTY,v9.M_CITY,v9.M_PRVNC ORDER BY MONTH_NAME,M_CNTY ;
Oracle中几个类似集合的用法
union all:将多个选择结果取并集,并且包含重复部分
unional:将
intersect:
minus:
Oracle拆分字段
如有下数据:我们需要将表格1中的数据形式转换成表格2的形式(也就是将老师这个字段拆成单行)
表1 表2
姓名 | 学科 | 老师 |
Jim | 语文 | 张三 李四 王五 |
Jim | 数学 | 牛儿 |
Jim | 英语 | 迈克尔 梁山伯 |
Lucy | 语文 | 老五 李四 |
姓名 | 学科 | 老师 |
Jim | 语文 | 张三 |
Jim | 语文 | 李四 |
Jim | 语文 | 王五 |
Jim | 数学 | 牛儿 |
Jim | 英语 | 麦克尔 |
Jim | 英语 | 梁山伯 |
Lucy | 语文 | 老五 |
Lucy | 语文 | 李四 |
此处的核心问题就是:需要将一条数据拆成多条数据
在解决这个问题之前,我们先来看看一个例子
regexp_substr函数的使用方法:
function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
String :需要进行正则处理的字符串
select regexp_substr('ABCD EF G','[^ ]+',1,level,'c') from dual connect by regexp_substr('ABCD EF G','[^ ]+',1,level,'c') is not null ;
这时候,我们得到的结果是:
同样的道理,我们来实现一开始的问题,先创建这么一张关系表:
CREATE TABLE t (student nvarchar2(20),subject nvarchar2(10),teacher nvarchar2(100) );INSERT INTO t VALUES('Jim','语文','张三 李四 王五'); INSERT INTO t VALUES('Jim','数学','牛儿'); INSERT INTO t VALUES('Jim','英语','迈克尔 梁山伯'); INSERT INTO t VALUES('Lucy','语文','老五 李四');
接下来,我们实现对teacher这个字段进行拆分,teacher中的每个值是按照空格分开的。
我们实现的代码是这样的:
select student,subject,regexp_substr(teacher,'[^ ]+',1,level) from t group by student,subject , teacher,level connect by regexp_substr(teacher,'[^ ]+',1,level) is not null order by 1;
最终结果:
此外,我们还有另外一种方法可以来解决这个问题,前提是我们需要把所有的teacher找出来做一个临时表,
利用like方法以及左连接来拆分
select t.student,t.subject,teacherRecord.teacher from t left outer join teacherRecord on t.teacher like '%' || teacherRecord.teacher || '%'
最终结果:
orcle数据库表导出csv文件
废话少说,直接来代码:
set colsep ,
set feedback off
set heading off
set trimout on
spool D:\DBoracle\lfc.csv
select '"' || yyyymm || '","' || yyyymmdd || '","' || bu_cd || '"from jim_CALL;
spool off
exit
转载于:https://www.cnblogs.com/Jims2016/p/5640138.html
Oracle基本函数即字段拆分相关推荐
- oracle拆分字段为多行,一句话实现字段拆分成多行
把表中某字段根据分隔符拆分成N个字符串后,再用这N个字符串把这一行演变成N行. 用SQL来解决这个问题非常烦琐! SQL里没有提供集合对象,不能提供根据拆分后的字符串集合把一行变成多行的操作.解决这个 ...
- oracle 表字段拆分,oracle 字段拆分
场景:Oracle 字段拆分有关问题 Oracle 字段拆分问题 我现在有一个字段是存:1,2,3的,而它对应另一张值集表中.eg; 课程人员表 id name Course 1 ...
- count 多个字段_一句话实现字段拆分成多行
把表中某字段根据分隔符拆分成N个字符串后,再用这N个字符串把这一行演变成N行. 用SQL来解决这个问题非常烦琐! SQL里没有提供集合对象,不能提供根据拆分后的字符串集合把一行变成多行的操作.解决这个 ...
- oracle判断非空并拼接,oracle sql 判断字段非空,数据不重复,插入多跳数据
oracle sql 判断字段非空,数据不重复 select distinct(mobile) from wx_user_mobile where active_time is not null ...
- oracle字符串清洗、拆分案例
oracle字符串清洗.拆分案例 需求描述 需求: 对给定的字符,按照点号对其进行拆分并以表的形式返回结果. 解决方法:通过 translate,结合自定义自增表.SUBSTR来实现字符串拆分. SQ ...
- kettle——入门操作-行列转换(行转列,字段拆分)
1.Row Normaliser,将一行多列数据转换为多行一列数据. 输入数据流: 计算器配置如下: 与计算器相连接的excel输出如下: Row Normaliser,设置如下, 与Row Norm ...
- clob类型用java怎么存,Java 储存和读取 oracle CLOB 类型字段的实用方法
当前位置:我的异常网» 编程 » Java 储存和读取 oracle CLOB 类型字段的实用方法 Java 储存和读取 oracle CLOB 类型字段的实用方法 www.myexceptions. ...
- mysql clob转string_Java获取Oracle中CLOB字段转换成String
Java获取Oracle中CLOB字段转换成String : try {PreparedStatement stmt = session.connection().prepareStatement(s ...
- 读取oracle bfile字段,ORACLE中BFILE字段的使用研究_oracle
因为做项目,需要使用BFILE字段存储图像文件,所以进行了一些研究. bfile字段实际的文件存储在文件系统中,字段中存储的是文件定位指针.bfile对 oracle来说是只读的,也不参与事务性控制和 ...
- oracle unused用法,set unused的用法(ORACLE刪除字段)
set unused的用法(ORACLE刪除字段) 一.問題 現場有一張大數據量的分區表,數據量在10G以上.因某種原因需要刪除其中的某些字段.如果直接用 alter table1 drop (col ...
最新文章
- 本科生顶刊发封面文章!他,是能成就导师的学生
- Codeforces 1103
- Oracle apex 搭建
- REST 在 Java 中的使用
- .net core word转pdf_免费在线转换PDF转Word、Word转PDF,办公必备神器
- html文本分类输出,构建中文网页分类器对网页进行文本分类
- kingate是一位国人开发的代理服务器
- linux查看某个端口的流量_Linux下如何对端口流量进行统计
- python des加密文件_python DES3 加密解密
- 关于FLEX中找不到目标对象或通道未定义错误
- 机器学习基石 作业0
- 暨南大学人文社科a类期刊_暨南大学人文社会科学重要期刊目录分类
- SQL编程-辣椒菠萝
- win10系统下删除文件夹失败,提示“找不到该项目”
- Windows下linux传盘工具,Windows下安装红旗Linux及工具盘全过程
- java api微盘_新浪微盘的API Python版封装
- My 2007 Fash game: Elite Shooter
- 滤色,颜色减淡,正片叠底
- 名帖315 沈尹默 行书《兰亭序》书轴
- win10 计算机管理器没有ime,win10电脑任务栏输入法初选ime禁用的解决方法