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 , --
- Date_Name date, --2016/7/4
- Year number, --
- Year_Half char(6), --2016H2
- Year_Month char(6), --
- Year_Quarter char(6),-- 2016Q3
- Half_Number number,--
- Half_Name char(2), --H2
- Quarter_Number number,--
- Quarter_Name char(2),--Q3
- Month_Number number,--
- Month_Name nvarchar2(20),--JUNL
- Week_Number number, --
- Week_Name nvarchar2(20),--Monday
- Creat_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_DATE
- AS
- v_Half number;
- v_Quarter number;
- v_Month DIM_Date.Month_Name%type;
- v_Month_Number number;
- CURSOR c_date IS
- SELECT Date_ID,DIM_Date.Date_Name FROM DIM_DATE;
- c_row c_date%rowtype;
- BEGIN
- MERGE INTO DIM_DATE T1
- USING(
- 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_Date
- on (t1.date_name=temp_Date.date_name)
- when matched then
- update set t1.date_id=to_char(temp_Date.date_name,'YYYYMMDD')
- when not matched then
- insert (Date_ID) values(to_char(temp_Date.date_name,'YYYYMMDD'));
- --循环游标
- FOR c_row in c_date loop
- v_Month_Number:=to_number(to_char(c_row.Date_Name,'MM'));
- if v_Month_Number>6 then
- v_Half:=2;
- else
- v_Half:=1;
- end if;
- update DIM_DATE set
- DIM_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 v3
- on 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 v8
- left 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
Oracle基本函数即字段拆分的更多相关文章
- Oracle 字段拆分替换在合并成一条
看了网上很多Oracle字段拆分的实例,但是都未能完全满足要求,或许是我水平不够未能很好的理解,如果有大神懂得并且愿意告知我的,可以私信我,在这里真诚的感谢! 1. 首先建立表并插入测试数据 drop ...
- Oracle数据库BLOB字段的存取
述] Oracle的Blob字段比较特殊,他比long字段的性能要好很多,可以用来保存例如图片之类的二进制数据. 写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cur ...
- java 存储oracle的clob字段
项目中有很长的字符创需要存储,用到了oracle的clob字段,直接很长的字符串插入到clob字段中会报字符过长的异常,于是便寻求解决方案.看到这个博客写的还不错 首先,创建一个含CLOB字段的表: ...
- 解决比较Oracle中CLOB字段问题
解决比较Oracle中CLOB字段问题 Oracle中CLOB和BLOB字段虽说在开发中满足了存放超大内容的要求,但是在一些简单使用中确频频带来麻烦.CLOB中存放的是指针,并不能直接取到实际值. ...
- sybase数据库和oracle数据库中字段中含有换行符的解决办法
最近在做数据库从sybase到oracle的迁移工作,sybase数据库表bcp导出后,通过sqlldr导入到oracle数据库,然后oracle数据库通过spool按照sybase数据库bcp的格式 ...
- Oracle 批量修改字段长度
Oracle 批量修改字段长度 SELECT 'alter table '||a.table_name||' MODIFY '||A.COLUMN_NAME||' VARCHAR2(100);' ...
- oracle数据库调整字段顺序
oracle数据库调整字段顺序 https://blog.csdn.net/xiaobaixie/article/details/77892034
- sqlserver 将 “用 特定字符 分隔的一个字段” 拆分成多个字段,然后两个表之间数据更新
将源TXT文件sourceFile_table.txt导入数据库,生成新表dbo.sourceFile_table.新增字段lon.lat.shi.xian 源表dbo.sourceFile_tabl ...
- oracle删除表字段和oracle表增加字段
这篇文章主要介绍了oracle表增加字段.删除表字段修改表字段的使用方法,大家参考使用吧 添加字段的语法:alter table tablename add (column datatype [d ...
随机推荐
- C++模板的一些巧妙功能
判断类中是否有指定名称的函数: #include<utility> #define HAS_MEMBER(member)\ template<typename T,typename. ...
- python with open as f 写韩文中文乱码
python3和python2的写法不一样具体如下: python3: with open(r'd:\ssss.txt','w',encoding='utf-8') as f: f.write(u'中 ...
- 【转】linux平台Redis安装部署
Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(diff ...
- java ----获取路径的各种方法(总结)
Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 那么针对这个站点的几个基本概念表述如下: 1. web站点的根目录:http: ...
- 线性表的链式存储——C语言实现
SeqList.h #ifndef _WBM_LIST_H_ #define _WBM_LIST_H_ typedef void List; typedef void ListNode; //创建并且 ...
- C语言学习笔记--指针阅读技巧
1. 指针阅读技巧:右左法则 (1)从最里层的圆括号中未定义的标示符看起 (2)首先往右看,再往左看 (3)遇到圆括号或方括号时可以确定部分类型,并调转方向 (4)重复 2.3 步骤,直到阅读结束 注 ...
- DAY17-Django之logging
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'standard': { 'format': ...
- 【WebRTC】术语
WebRTC,名称源自网页实时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API.它于2011年6月1日开源并在Goog ...
- redis的特性
- Codeforces #536 div2 E (1106E)Lunar New Year and Red Envelopes (DP)
题意:过年了,Bob要抢红包.抢红包的时间段为1 - n,有m个红包,每个红包有三个属性:st(红包出现的时间), ed(红包消失的时间),d(如果抢了这个红包,能够抢下一个红包的时间),w(红包的收 ...