当前位置: 代码迷 >> SQL >> 记一上较复杂的SQL
  详细解决方案

记一上较复杂的SQL

热度:61   发布时间:2016-05-05 13:27:53.0
记一下较复杂的SQL

最近在应用中用到两张表:

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

?

  相关解决方案