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 ...
随机推荐
- 第 十六 课 Map
Map 是一种无序的键值对的集合 var mymap map[string]string //先声明一个字典(map)名字叫做mymap,其key所对应的数据类型是string[字符串],value所 ...
- pa15-三省吾身
序号 项 1 凡事提前10分钟 凡事提前10分钟,会让你有充裕的时间应对可能的突发事件,更加从容. 试着把起床闹钟提前10分钟,你就会发现你出门不必急匆匆,早饭也可慢慢享用,一整天的状态也 ...
- 问题:C#控制台;结果:C#限制程序只能运行一個实例 (防多开)
C# Console类的具体用法 作者: 字体:[增加 减小] 类型:转载 时间:2013-03-08 这篇文章主要介绍C# Console类的具体用法,需要的朋友可以参考下 Console.Wr ...
- hadoop job -kill 与 yarn application -kii(作业卡了或作业重复提交或MapReduce任务运行到running job卡住)
问题详情 解决办法 [hadoop@master ~]$ hadoop job -kill job_1493782088693_0001 DEPRECATED: Use of this script ...
- 每天一道算法题(12)——和为n的连续正数序列或者随机数
题目:输入一个正数n,输出所有和为n 连续正数序列.例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3 个连续序列1-5.4-6 和7-8. 1.思路 尊崇以下策略: (1)对 ...
- Ajax笔记(一)
Ajax三步骤: Asynchronous Javascript And XML 1.运用HTML和CSS实现页面,表达信息: 2.运用XMLHttpRequest和web服务器进行数据的异步交换: ...
- transient关键字的理解
谈到这个transient这个关键字,我们应该会立马想到序列化这个过程:什么是序列化?什么又是反序列化呢?序列化就是将对象转化内成二进制,而反序列化就是就二进制文件转换成对象的过程.一旦变量使用了tr ...
- 第2章 构建springboot工程 2-2 使用Spring官方STS搭建SpringBoot工程
项目名demo,SpringBoot的版本2.0.6 删了/demo/mvnw和/demo/mvnw.cmd.static文件夹包含静态文件,比如CSS.JS.templates文件夹是放模板的,Sp ...
- js 控制标记样式
做一个变色的标签 鼠标移入变为灰色,移除变回原来的颜色,点击变成黑色,再点击变回,如果变成黑色不受移入移除影响. <body> <div class="bt1" ...
- Windows系统 为 Visual Studio软件 搭建 OpenCV2 开发环境
Windows系统 为 Visual Studio软件 搭建 OpenCV2 开发环境 我们的电脑系统:Windows 10 64位 Visual Studio 软件:Visual Studio 20 ...