oracle字符串處理substr、dbms_lob.substr、case when


1. substr函數使用

substr函數格式 (俗稱:字符截取函數)

格式1: substr(string string, int a, int b);
格式2:substr(string string, int a) ;

格式1:
1、string 需要截取的字符串
2、a 截取字符串的開始位置(注:當a等於0或1時,都是從第一位開始截取)
3、b 要截取的字符串的長度

格式2:
1、string 需要截取的字符串
2、a 可以理解為從第a個字符開始截取后面所有的字符串。

注:https://www.cnblogs.com/dshore123/p/7805050.html

2. dbms_lob.substr函數使用

CLOB里存的是2進制
判定長度 dbms_lob.getlength(col1)
獲取文本 dbms_lob.substr(col1,n,pos)
dbms_lob.substr(col1,10,1)表示從第1個字節開始取出10個字節

注:https://blog.csdn.net/daxiang12092205/article/details/20283359

-- dbms_lob.substr函數第二個參數有時不能為4000(3960或3000),有時可以(測試數據4000個英文字符)
select dbms_lob.substr(a.txt,3000,1),length(a.txt),DBMS_LOB.getlength(a.txt),a.* from jc_content_txt a
-- 測試表,DBMS_LOB.SUBSTR為4000或5000均可
select DBMS_LOB.SUBSTR(txt,5001) from jc_content_txt_test

以上問題可結合eclipse、jdbc、oracle做一個測試。

dbms_lob.substr第二個參數是要從大型對象中抽取的字節數,這樣可以理解測試sql中的4000或5000。

而第一條sql中第二個參數不能為4000(3960或3000),估計是超過varchar2的4k限制(4k指字節還是字符),4k指的是字節。而DBMS_LOB.SUBSTR第二個參數指的是字符的個數(通過測試可驗證),它會轉成varchar2。

dbms_log.substr的第二個參數是字符數,非字節。

https://blog.csdn.net/swordmanwk/article/details/6204611

http://www.voidcn.com/article/p-tvbhgpdf-byk.html

https://www.thinbug.com/q/1797183

https://www.cnblogs.com/Tty725/p/13750663.html

https://blog.csdn.net/e_wsq/article/details/7068091

https://www.cnblogs.com/grand-jon/p/7389427.html

https://blog.csdn.net/yfleng2002/article/details/7794784

https://www.cnblogs.com/zhixie/p/11968710.html

3.case when 使用

CASE
   WHEN to_char(a.issuedt,'yyyy-mm-dd hh24:mi:ss') = '1900-01-01 00:00:00' THEN ''
   ELSE to_char(a.issuedt,'yyyy-mm-dd hh24:mi:ss')
END issuedt ,

注:issuedt是日期類型,該值默認是原點時間。需求是如果是原點時間,則為空。

4. case when 結合getlength

SELECT *
FROM
  (SELECT A.GUESTBOOK_ID AS ID,
          A.SITE_ID AS SITEID,
          A.CREATE_TIME AS CREATETIME,
          A.IS_CHECKED AS ISCHECKED,
          A.IS_RECOMMEND AS ISRECOMMEND,
          B.TITLE,
          case when DBMS_LOB.getlength(B.CONTENT) <=300 then dbms_lob.substr(B.CONTENT,300,1) else  CONCAT(dbms_lob.substr(B.CONTENT,300,1),'...') end AS CONTENT,
          dbms_lob.substr(B.REPLY) AS REPLY,
          B.NAME,
          A.GUESTBOOKCTG_ID AS CTGID,
          C.CTG_NAME AS CTGNAME
   FROM JC_GUESTBOOK A
   LEFT JOIN JC_GUESTBOOK_EXT B ON A.GUESTBOOK_ID = B.GUESTBOOK_ID
   LEFT JOIN JC_GUESTBOOK_CTG C ON A.GUESTBOOKCTG_ID = C.GUESTBOOKCTG_ID
   UNION ALL
 SELECT SERVICE_ID AS ID,
                    SITE_ID AS SITEID,
                    CREATE_TIME AS CREATETIME,
                    IS_CHECKED AS ISCHECKED,
                    IS_RECOMMEND,
                    SUBJECT AS TITLE,
                    case when DBMS_LOB.getlength(CONTENT) <=300 then dbms_lob.substr(CONTENT,300,1) else  CONCAT(dbms_lob.substr(CONTENT,300,1),'...') end AS CONTENT,
                    dbms_lob.substr(REPLAY) AS REPLY,
                    NAME,
                    99,
                    '企業服務'
   FROM JC_ENTERPRISESERVICE) T
WHERE 1=1
  AND T.ISCHECKED=1
 ORDER BY T.CREATETIME DESC


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM