日期:2014-05-16  浏览次数:21173 次

一个sql的问题 能否把括号去掉达到同样的效果
今天在公司写了一个简单的sql

SELECT N.APN_NI,
       N.START_TIME_UTC_OFFSET,
       CASE
         WHEN 0 = :GUI_FILE_SOURCE THEN
          (SELECT F.FILENAME
             FROM IB_NRT_FILELIST F
            WHERE N.NRT_FILE_ID = F.FILE_ID(+))
         ELSE
          (SELECT M.FILE_NAME
             FROM IB_FMS_FILELIST M
            WHERE N.FILE_ID = M.FILE_ID(+))
       END AS FILENAME
  FROM &CDR_TABLE& N,
       IB_EVENT_STATE     S,
       IB_ERR_TYPE        ET,
       IB_PARTNER         P
 WHERE 1 = 1
   AND N.ERR_TYPE_ID = ET.ERR_TYPE_ID(+)
   AND N.STATE = S.STATE(+)
   AND N.PARTNER_ID = P.PARTNER_ID(+)

但是用公司的框架保存sql到数据库的时候  对于then和else后面的括号解析不了 只有把then和else后面的括号去掉才能保存  如果如掉括号sql就肯定跑不动

请问下这个sql 怎么改动才能把then和else后面的括号去掉 又能让SQL跑起来

------解决方案--------------------
引用:
Quote: 引用:

SELECT F.FILENAME
FROM IB_NRT_FILELIST F
WHERE N.NRT_FILE_ID = F.FILE_ID(+)
既然只取F的数据没必要用外连接,可以把(+)去掉,你说的框架工具是啥,不能修改sql ?
这个不是 外联的问题 我去掉了 还是不行 现在的问题是 我通过框架保存sql到数据库的时候 sql里面的THEN和ELSE后面的括号不能有,否则不能保存
有没有其他的写法

将CASE WHEN 换成DECODE试试呢,我不知道你的框架能不能解析decode里的括号
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

SELECT F.FILENAME
FROM IB_NRT_FILELIST F
WHERE N.NRT_FILE_ID = F.FILE_ID(+)
既然只取F的数据没必要用外连接,可以把(+)去掉,你说的框架工具是啥,不能修改sql ?
这个不是 外联的问题 我去掉了 还是不行 现在的问题是 我通过框架保存sql到数据库的时候 sql里面的THEN和ELS