Oracle将一列分成多列
在Oracle中,我们可以使用listagg(Oracle 11g及以上)将多行合并成中的某一列合并成一列,现在我们的需求是将一列分割成多列。
先建立一张表,插入测试数据:
CREATE TABLE CELEBRITY(
NAME VARCHAR2(100)
INSERT INTO CELEBRITY VALUES ('Stephen King');
INSERT INTO CELEBRITY VALUES ('Tom Hanks');
INSERT INTO CELEBRITY VALUES ('Christopher Nolan');
查询该表其结构如下:
| NAME |
|---|
| Stephen King |
| Tom Hanks |
| Christopher Nolan |
现在将表分割成两列:
SELECT
REGEXP_SUBSTR(name,'^[^ ]*') first_name,
REGEXP_SUBSTR(name, '([[:alpha:]]+)$') middle_name
FROM CELEBRITY
其中我们使用到了REGEXP_SUBSTR函数,其使用正则进行匹配,将一列分成两列,其结果如下:
| FIRST_NAME | MIDDLE_NAME |
|---|
| Stephen | King |
| Tom | Hanks |
| Christopher | Nolan |
当然,我们可以使用INSTR函数来进行分割:
SELECT
SUBSTR(NAME, 1, INSTR(NAME, ' ')-1) FIRST_NAME,
SUBSTR(NAME, INSTR(NAME, ' ')+1) MIDDLE_NAME
FROM CELEBRITY
或者我们这样:
SELECT
SUBSTR(NAME, 1, SPACE_POS-1) FIRST_NAME,
SUBSTR(NAME, SPACE_POS+1) MIDDLE_NAME
FROM (SELECT NAME,INSTR(NAME, ' ') SPACE_POS
FROM CELEBRITY)
以上方法均可以将一列分成两列。
Oracle将一列分成多列在Oracle中,我们可以使用listagg(Oracle 11g及以上)将多行合并成中的某一列合并成一列,现在我们的需求是将一列分割成多列。先建立一张表,插入测试数据:CREATE TABLE CELEBRITY( NAME VARCHAR2(100) );INSERT INTO CELEBRITY VALUES ('Stephen King'
select
max(case when F1%3=1 then F1 else 0 end) a,
max(case when F1%3=2 then F1 else 0 end) b,
max(case when F1%3=0 then F1 else 0 end) c
from HLR151
group by (F1-1)/3
select
c1=a.F1,c2=b.F1,c3=c.F1
from HLR151 a
left join HLR151 b on b.F1=a.
temp.idenName,
avg(CASE temp.hjState WHEN '2' THEN temp.days END) 缴费 ,
avg(CASE temp.hjState WHEN '5' THEN temp.days END) 移送申请 ,
avg(CASE temp.hjState WHEN '8' THEN temp.days END) 移送审批 ,
avg(CASE temp.hjState WHEN '10' THEN temp.days END) 对账 ,
oracle中实现对某一列分组,并显示多列的写法
1.场景:
之前一直用的mysql,在处理分组问题,就非常的方便,直接使用group by就搞定了,但用oracle,直接使用group by只能实现显示的所有列都参与的分组,并且显示的列必须和group by后边的列对应,否则sql报错,如下图。
2.分析:
通过网上查找资料,发现mysql,oracle数据库的分组函数group by是不一样的,这个坑很大,被坑惨了,在mysql中,只需要将要分组的列写到group by后边,就可以查询分好组后的全部列
with t1 as (select 'a=1&b=2&c=3&d=4&e=5' as params from dual)
select id,
SUBSTR(data, 1, INSTR(data, '=') - 1) AS name,
SUBSTR(data, INSTR(data, '=') + 1) AS value
from (select LEVEL AS id, REGEXP_SUBSTR.