Oracle SQL中的NESTED IF

问题描述 投票:-3回答:2
--mesinicio parameter goes here
IF 1 = 1 
 THEN


---cantmeses parameter also here
        IF 1 = 1   ---Invalid SQL statement
        THEN
        SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.saldototal   FROM mccont a  WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
        ELSIF '?cantmeses' = 2 THEN
        SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.saldototal   FROM mccont a WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
        ELSIF '?cantmeses' = 3 THEN
        SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.saldototal   FROM mccont a WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);

        ELSIF '?cantmeses' = 4 THEN
        SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
       a.habr,a.saldototal   FROM mccont a WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);

        ELSIF '?cantmeses' = 5 THEN
        SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
       a.habr,a.dmay, a.hmay,a.saldototal   FROM mccont a WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
      ELSIF '?cantmeses' = 6 THEN
       SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
       a.habr,a.dmay, a.hmay, a.djun, a.hjun, a.saldototal   FROM mccont a WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
       ELSIF '?cantmeses' = 7 THEN
         SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
       a.habr,a.dmay, a.hmay, a.djun, a.hjun,a.djul, a.hjul, a.saldototal   FROM mccont a WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
       ELSIF '?cantmeses' = 8 THEN
         SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
       a.habr,a.dmay, a.hmay, a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago, a.saldototal   FROM mccont a WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
      ELSIF '?cantmeses' = 9 THEN
        SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
       a.habr,a.dmay, a.hmay, a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset, a.saldototal   FROM mccont a WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
     ELSIF '?cantmeses' = 10 THEN
       SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
       a.habr,a.dmay, a.hmay, a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset,a.doct, a.hoct, a.saldototal   FROM mccont a WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
       ELSIF '?cantmeses' = 11 THEN
          SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
       a.habr,a.dmay, a.hmay, a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset,a.doct, a.hoct,a.dnov, a.hnov, a.saldototal   FROM mccont a WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
       ELSIF  '?cantmeses' = 12 THEN

       SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dene, a.hene,a.dfeb, a.hfeb,a.dmar, a.hmar,a.dabr,
       a.habr,a.dmay, a.hmay, a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset,a.doct, a.hoct,a.dnov, a.hnov,a.ddic, a.hdic, a.saldototal   FROM mccont a WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
       END IF;



    --febrero
ELSIF '?mesinicio' = 2 THEN

         IF '?cantmeses' = 1
         THEN 
         SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.saldototal   FROM mccont a  WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
        ELSIF '?cantmeses' = 2 THEN
        SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar,a.saldototal   FROM mccont a  WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
        ELSIF '?cantmeses' = 3 THEN
        SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
       a.habr,a.saldototal   FROM mccont a  WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
        ELSIF '?cantmeses' = 4 THEN
          SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
       a.habr,a.dmay, a.hmay,a.saldototal   FROM mccont a  WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
      ELSIF '?cantmeses' = 5 THEN
       SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
       a.habr,a.dmay, a.hmay,a.djun, a.hjun,a.saldototal   FROM mccont a  WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
       ELSIF '?cantmeses' = 6 THEN
        SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
       a.habr,a.dmay, a.hmay,a.djun, a.hjun,a.djul, a.hjul,a.saldototal   FROM mccont a  WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
       ELSIF '?cantmeses' = 7 THEN
        SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
       a.habr,a.dmay, a.hmay,a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.saldototal   FROM mccont a  WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);

      ELSIF '?cantmeses' = 8 THEN
         SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
       a.habr,a.dmay, a.hmay,a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset,a.saldototal   FROM mccont a  WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
      ELSIF '?cantmeses' = 9 THEN
          SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
       a.habr,a.dmay, a.hmay,a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset,a.doct, a.hoct,a.saldototal   FROM mccont a  WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
 ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
       ELSIF '?cantmeses' = 10 THEN
        SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
       a.habr,a.dmay, a.hmay,a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset,a.doct, a.hoct, a.dnov, a.hnov,a.saldototal   FROM mccont a  WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
 ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
       ELSIF '?cantmeses' = 11 THEN
          SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
       a.habr,a.dmay, a.hmay,a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset,a.doct, a.hoct, a.dnov, a.hnov,a.ddic, a.hdic,a.saldototal   FROM mccont a  WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
 ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);
       ELSIF '?cantmeses' = 12 THEN
        SELECT a.ctainterna, a.ejercicio, a.cuenta, a.nombre, a.dapertura, a.hapertura,a.dfeb, a.hfeb,a.dmar, a.hmar, a.dabr,
       a.habr,a.dmay, a.hmay,a.djun, a.hjun,a.djul, a.hjul,a.dago, a.hago,a.dset, a.hset,a.doct, a.hoct, a.dnov, a.hnov,a.ddic, a.hdic,a.dene, a.hene,a.saldototal   FROM mccont a  WHERE a.ejercicio = '?EJ'
 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) 
 ORDER BY DECODE('?O','1',CTAINTERNA), DECODE('?O','2',CUENTA);

       END IF;

       ELSE

      select * from mccont;

 END IF;

大家好,我正在尝试根据参数'mesinicio'和'cantmeses'对月份列进行排序

'mesinicio'用于开始的月份'cantmeses'用于月份数

我试图替换参数以测试其是否有效,并在第二个“ IF”中提示“无效的SQL语句”,并抛出错误和其他提示。我看不到我做错了什么,将不胜感激。谢谢

问候

sql oracle nested-if
2个回答
1
投票

在SQL中,您要查找的IF逻辑是CASE STATEMENT。

我建议使用CASE语句创建一个新的派生列,称为“过滤器”,该列标识具有指定条件的每一行。但是您只执行一次SELECT,就不会将SELECT嵌套在case语句中。

喜欢这个:

SELECT *
,CASE 
   WHEN '?cantmeses' = 1 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) THEN 'Condition 1'
   WHEN '?cantmeses' = 2 AND a.tipocta=DECODE('?CU',1,1,0,0,2,A.TIPOCTA) THEN 'Condition 2'
   ....
   ELSE 'No Condition'
END as "FILTER"
FROM TABLE
WHERE ...
;

0
投票

看来您的逻辑可以简化为

SELECT *
   FROM mccont a
   WHERE a.ejercicio = '?EJ' AND
         a.tipocta=DECODE('?CU',
                            1, 1,
                            0, 0,
                            2, a.TIPOCTA)
   ORDER BY DECODE('?O',
                     '1', CTAINTERNA,
                     '2', CUENTA);

我对这张桌子的设计有个建议。您每个月都有两个字段(例如,一月数据为DENE和HENE,二月数据为DFEB和HFEB,三月数据为DMAR和HMAR,等等)。更好的选择是拥有一个头表和一个单独的月份数据,每个月的数据都存储在单独的行中-类似于

MCCONT
  ID_MCCONT - primary key, NUMBER
  CTAINTERNA
  EJERCICIO
  CUENTA
  NOMBRE
  DAPERTURA
  HAPERTURA
  SALDOTOTAL

MONTH_DATA
  ID_MONTH_DATA - primary key, NUMBER
  ID_MCCONT - NUMBER, NOT NULL, foreign key to MCCONT
  MONTH_NAME  VARCHAR2(15) NOT NULL
  D_VAL       Holds the data currently in DENE, DFEB, DMAR, etc.
  H_VAL       Holds the data currently in HENE, HFEB, HMAR, etc

这使您可以使用联接将数据放在一起,如

SELECT *
  FROM MCCONT a
  INNER JOIN MONTH_DATA b
    ON b.ID_MCCONT = a.ID_MCCONT

这可能会使您的任务容易一些。

© www.soinside.com 2019 - 2024. All rights reserved.