相关文章推荐
开心的足球  ·  python ...·  1 年前    · 
体贴的小马驹  ·  es 字段权重排序 ...·  1 年前    · 
英勇无比的核桃  ·  CSS3 ...·  2 年前    · 
精明的伤痕  ·  iOS WebSocket长链接 - 简书·  2 年前    · 

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_NAMEMIDDLE_NAME
StephenKing
TomHanks
ChristopherNolan

当然,我们可以使用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.