Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用case在where子句(Oracle)中的两个句子之间进行选择_Sql_Oracle11g - Fatal编程技术网

Sql 使用case在where子句(Oracle)中的两个句子之间进行选择

Sql 使用case在where子句(Oracle)中的两个句子之间进行选择,sql,oracle11g,Sql,Oracle11g,我正在创建一个函数,我需要根据参数的值(PTIPO)在两句话中进行选择 下面是我的代码 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.VA

我正在创建一个函数,我需要根据参数的值(PTIPO)在两句话中进行选择

下面是我的代码

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);
错误是“缺少关键字”,但我知道问题是最后一种情况。
否则我怎么能在这些句子中选择呢。大小写是正确的方式还是应该使用其他语句?

大小写可以返回值,但不能返回表达式。这应该可以做到,尽管我觉得可能更简单:

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))
  )
选择SUM(
案例PTIPO
当0时,则(当(A.NT=0)时,则A.VALOR否则0结束)
当1那么(当(A.NT=1)那么A.VALOR否则0结束时)
当2那么(当(A.NT=1)那么A.VALOR或者-A.VALOR-END)
(完)
进入NREP
来自mov_caja a
在a.docid=b.docid上连接enc_movp b
在a.cajaid=c.cajaid上加入c_caja c
哪里
c、 cajaid=pcajaid和
( 
(PTIPO=2和(在pfecha_ini和pfecha_fin之间的b.cod_compro=ncompini或b.fecha_mov))
或
(PTIPO 2和(b.cod_compo!=pfecha_ini和pfecha_fin之间的ncompini和b.fecha_mov))
)
试试这个:

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

美好的您还应该注意
PTIPO
NULL
的情况。非常感谢。我能问一下它是怎么工作的吗?它是否评估PTIPO的值并像条件句一样工作?@ypercube我不知道PTIPO是否可以为空,但这无关紧要。查询结果是case语句的总和,如果PTIPO为null,则该语句将不会起多大作用。:)