Oracle 常用SQL写法

1、取表中某个字段,包含某字符串的数据

Select h.*
  From Table_Name h
 Where h.Interface_Code = 'XXXXXXXX'
   and 1 = 1
   And h.Creation_Date >= Sysdate - 1
   And instr(substr(h.Request_Data, 1, 3500), 'XXXXX0001') > 1

2、查询某个字段是否有重复数据

select COUNT(1), T.SEGMENT2
  from Table_Name T
 WHERE 1 = 1 HAVING COUNT(1) > 1
 GROUP BY T.SEGMENT2

 

3、取表中同一标识的多条数据中的最新数据

select a.header_id
  from (SELECT ROW_NUMBER() OVER(PARTITION BY t.PROJECT_ID ORDER BY t.last_update_date DESC) rn,
               t.header_id
          FROM Table_Name t
         WHERE 1 = 1
           AND T.Project_Id = 1) a
 where a.rn = 1

4、字符串按分号隔开,用正则表达式拆成多列

SELECT REGEXP_SUBSTR('A;B;C;D;E;AA', '[^;]+', 1, ROWNUM)
  FROM DUAL
CONNECT BY ROWNUM <= LENGTH('A;B;C;D;E;AA') -
           LENGTH(REPLACE('A;B;C;D;E;AA', ';', '')) + 1
SELECT *
  FROM Table_Name t
  From t.segment1 IN
       (SELECT REGEXP_SUBSTR('A;B;C;D;E;AA', '[^;]+', 1, ROWNUM)
          FROM DUAL
        CONNECT BY ROWNUM <= LENGTH('A;B;C;D;E;AA') -
                   LENGTH(REPLACE('A;B;C;D;E;AA', ';', '')) + 1)

5、(行列)多行数据将某个字段合并成一行

SELECT listagg(t.sql_text, ',') within GROUP(ORDER BY t.piece) AS NAME
  FROM (SELECT st.sql_text, piece
          FROM apps.fnd_concurrent_requests req,
               gv$session                   gs,
               gv$sqltext                   st
         WHERE 1 = 1
           AND req.request_id = 25166889
           AND req.oracle_session_id = gs.audsid
           AND gs.sql_id = st.sql_id
         ORDER BY piece) t
 GROUP BY t.piece;

6、(列转行)多个字段数据展示成不同行数据

正常查我们的sql和结果长这样:

 

如果需要将行转成列,sql如下:

SELECT T1.*
  FROM (select v.lookup_code || v.SEGMENT1 SEGMENT1,
               v.lookup_code || v.SEGMENT2 SEGMENT2,
               v.lookup_code || v.SEGMENT3 SEGMENT3,
               v.lookup_code || v.SEGMENT4 SEGMENT4,
               v.lookup_code || v.SEGMENT5 SEGMENT5
          from cux_fnd_lookup_values v
         where v.lookup_type = 'CUX_EAM_ASSET_CATEGORY_GROUP'
           and v.enabled_flag = 'Y'
           and v.lookup_code = '21'
           and nvl(v.start_date_active, sysdate) <= sysdate
           and nvl(v.end_date_active, sysdate + 1) >= sysdate) unpivot(CATEGORY_CODE FOR b IN(SEGMENT1,
                                                                                              SEGMENT2,
                                                                                              SEGMENT3,
                                                                                              SEGMENT4,
                                                                                              SEGMENT5)) T1

 结果如下:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值