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的查詢結果只能返回一個值,否則就會報錯。