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