最近在应用中用到两张表:
XZ_VIEW_INDEX_SJFW : 主表
ACF_SYS_GWATTACH : 正文/附件存储表
正文或附件都以Blob字段存于 正文/附件存储表 中,该表的FILE_ID字段与主表中的ZW(正文序号)或FJ(附件序号)相关联。但是主表中的ZW和FJ字段是VARCHAR型的,而 正文/附件存储表 中的FILE_ID字段是数值型的,并且,主表中的ZW,FJ两个字段有可能为空,也有可能是中文,所以不能直接使用关联来从三张表中查询记录。
现在要求就是用一个SQL查询数据,如果有ZW或FJ值,则需要从 正文/附件存储表 中把对应的正文或附件也取出来。
为了防止非数值型与数值型字段值进行比较导致出错,所以先写了个自定义函数用来判断一个值是否是数字:
CREATE OR REPLACE FUNCTION IsNum (p_in VARCHAR2) RETURN NUMBER AS val NUMBER; BEGIN select NVL(length(translate(trim(p_in),' +-.0123456789',' ')),0) into val from dual; if val=0 then return 1; else return 0; end if; END IsNum;
然后费了九牛二虎之力拼凑出一个SQL,在这里记一下,防止忘记:
--发文随机抽样 select * from ( select A.MODULE_CODE, A.BIZ_CODE, A.OP_TYPE, A.LASTTIME, A.BT, A.WH, A.ZTC, A.CYCL, A.SJ, A.ZW, A.FJ, decode(isNum(A.ZW), 1, B.EXT_NAME, -1) "正文扩展名", decode(isNum(A.ZW), 1, B.FILE_NAME, -1) "正文文件名", decode(isNum(A.ZW), 1, B.FILE_CONTENT, empty_blob()) "正文", decode(isNum(A.FJ), 1, C.EXT_NAME, -1) "附件扩展名", decode(isNum(A.FJ), 1, C.FILE_NAME, -1) "附件文件名", decode(isNum(A.FJ), 1, C.FILE_CONTENT, empty_blob()) "附件" from UA.XZ_VIEW_INDEX_SJFW A, UB.ACF_SYS_GWATTACH B, UB.ACF_SYS_GWATTACH C where B.FILE_ID(+)=decode(isNum(A.ZW), 1, A.ZW, null) and C.FILE_ID(+)=decode(isNum(A.FJ), 1, A.FJ, null) order by dbms_random.value ) where rownum <= 10