嵌套在oracle sql中

fnvucqvd  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(272)
--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”中抛出我和错误,说“invalidsqlstatement”而不是别的。我看不出我做错了什么,希望能得到一些帮助。谢谢
当做

643ylb08

643ylb081#

在sql中,您要寻找的if逻辑是case语句。
我建议使用case语句创建一个名为“filter”的新派生列,该列根据指定的条件标识每一行。但您只选择一次,而不在case语句中嵌套select。
这样地:

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 ...
;
4jb9z9bj

4jb9z9bj2#

看来你的逻辑可以简化为

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);

我对这张table的设计有个建议。每个月有两个字段(例如1月数据的dene和hene,2月数据的dfeb和hfeb,3月数据的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

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

相关问题