oracle decode()函數的參數原來可以為sql語句!


1.情景展示

  判斷某個字段的值,如果以APP開頭,需查詢APP表里對應的數據;如果是以JG開頭,就查詢機構對應的表。

2.原因分析

  如果使用CASE WHEN THEN或者IF ELSIF 太麻煩,可以通過decode()函數實現哦。

語法說明:

  DECODE(VALUE,IF1,THEN1,IF2,THEN2,ELSE) 是對CASE WHEN 的簡化 

  我們對於decode()函數的應用一般是這樣的

SELECT decode(t.medstepcode,
              '010101',
              '掛號',
              '010102',
              '診斷',
              '010103',
              '取葯',
              '010104',
              '檢查',
              '010105',
              '收費',
              '010106',
              '開方',
              '010107',
              '手術',
              '000000',
              '其他',
              '掛號') medStepName /* 診療環節名稱 */
  FROM VIRTUAL_CARDLOG T

  這樣,查詢結果會將對應的數字字符串替換文字。

3.解決方案

  錯誤用法:直接跟sql

  結果執行報錯。

  正確用法:sql需要用括號包住即可。

SELECT to_char(t.logtime, 'yyyyMMdd-HH24mmss') time /* 用卡時間 */,
       '0' cardType, /* 電子健康卡 */
       t2.id_card atr, /* 身份證號 */
       t2.identifier issueOrgCode, /* 發卡機構代碼 */
       (decode(instr(t2.identifier, 'APP'),
               0, /* 不是以APP開頭 */
               (select t3.orgname
                  from org_access t3 /* 接入機構 */
                 where t3.id = t2.identifier),
               (select t4.appname
                  from app_access t4 /* 接入APP */
                 where t4.id = t2.identifier))) issueOrgName /* 發卡機構名稱 */
  FROM VIRTUAL_CARDLOG T, VIRTUAL_CARD T2
 WHERE T.VIRTUAL_ID = T2.ID

  說明:instr()函數是判斷某個字符串內是否包含指定字符串,在這里不影響判斷。

4.結果展示

  說明:雖然decode()可以使用sql語句,但也僅限於該SQL的查詢結果只能返回一個值,否則就會報錯。

 

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:

 


免責聲明!

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



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