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 ...
随机推荐
- Java-API:java.util.ArrayList
ylbtech-Java-API:java.util.ArrayList 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 0. https://docs.orac ...
- Python类(八)-类的起源
首先用type()看一下类和实例化对象的类型 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" class Person(obj ...
- react-router4.x 实用例子(路由过渡动画、代码分割)
react-router4.2.0实用例子 代码分割 官网上面写的代码分割是不支持create-react-app脚手架的,要使用import实现 创建一个bundle.js文件 import { C ...
- windows服务编写和“以管理员运行”程序的方法
本文将首先解释如何 创建 一个定期查询可用物理内存并将结果写入某个文本文件的服务.然后指导你完成生成,安装和实现服务的整个过程. 第一步:主函数和全局定义 首先,包含所需的头文件.例子要调用 Win3 ...
- Github修改项目显示的语言类型
//仓库的根目录下创建 .gitattributes 文件,添加以下代码: *.js linguist-language=java *.css linguist-language=java *.htm ...
- od命令 查看二进制文件
od命令用于输出文件的八进制.十六进制或其它格式编码的字节,通常用于显示或查看文件中不能直接显示在终端的字符. 以数值进制格式输出:od [选项] 文件 od -d 文件 --十进制输 ...
- 用C++的基本算法实现十个数排序
冒泡排序法 原理: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 冒泡排序算法的运作如下 ...
- jquery easyui datagrid/table 右边线显示不全
<table id="dg" style="height:400px"></table> 右边线显示不全 解决:在外面套一个panel, ...
- 面试题: Struts2
1. Struts2与Struts1的联系与区别是什么?为什么要用Struts2? 答案: struts1与struts2都是mvc框架的经典实现模式. Struts2不是从Struts1升级而来,而 ...
- Elasticsearch - 环境准备
Precondition: Ubuntu OS 环境准备: 1. JAVA_HOME 1.1 Download the jdk8 (jdk-8u25-linux-x64.tar.gz) from of ...