3

関数を作成していますが、パラメーターの値 (PTIPO) に応じて 2 つの文から選択する必要があります

以下は私のコードです

SELECT SUM(
    CASE PTIPO
      WHEN 0 THEN (CASE WHEN (A.NT = 0) THEN A.VALOR ELSE 0 END)
      WHEN 1 THEN (CASE WHEN (A.NT = 1) THEN A.VALOR ELSE 0 END)
      WHEN 2 THEN (CASE WHEN (A.NT = 1) THEN A.VALOR ELSE -A.VALOR END) 
    END)
INTO nresp
FROM mov_caja a
JOIN enc_movp b ON a.docid = b.docid
JOIN c_caja c ON a.cajaid = c.cajaid
WHERE c.cajaid = pcajaid AND( 
    CASE WHEN(PTIPO = 2) --this is what causes the issue.
    THEN
    b.cod_compro = ncompini OR (b.fecha_mov BETWEEN pfecha_ini AND pfecha_fin)
    ELSE
    b.cod_compro != ncompini AND b.fecha_mov BETWEEN pfecha_ini AND pfecha_fin
    END);

エラーは「キーワードがありません」ですが、問題は最後のケースであることはわかっています。他にどのように文を選択できますか。ケースは適切な方法ですか、それとも別のステートメントを使用する必要がありますか?

4

2 に答える 2

3

ケースは値を返すことはできますが、式を返すことはできません。これでうまくいくはずですが、もっと簡単かもしれないと思います。

SELECT SUM(
    CASE PTIPO
      WHEN 0 THEN (CASE WHEN (A.NT = 0) THEN A.VALOR ELSE 0 END)
      WHEN 1 THEN (CASE WHEN (A.NT = 1) THEN A.VALOR ELSE 0 END)
      WHEN 2 THEN (CASE WHEN (A.NT = 1) THEN A.VALOR ELSE -A.VALOR END) 
    END)
INTO nresp
FROM mov_caja a
JOIN enc_movp b ON a.docid = b.docid
JOIN c_caja c ON a.cajaid = c.cajaid
WHERE 
  c.cajaid = pcajaid AND
  ( 
    (PTIPO = 2 and (b.cod_compro = ncompini OR b.fecha_mov BETWEEN pfecha_ini AND pfecha_fin))
OR
    (PTIPO <> 2 and (b.cod_compro != ncompini AND b.fecha_mov BETWEEN pfecha_ini AND pfecha_fin))
  )
于 2013-01-26T15:46:20.300 に答える
1

これを試して:

WHERE c.cajaid = pcajaid AND
       (
          PTIPO = 2
             AND (
                    b.cod_compro = ncompini
                    OR b.fecha_mov BETWEEN pfecha_ini AND pfecha_fin
                 )
  OR
         PTIPO != 2
             AND (
                   b.cod_compro != ncompini
                   AND b.fecha_mov BETWEEN pfecha_ini AND pfecha_fin
                 )
       )
于 2013-01-26T15:48:41.397 に答える