【问题标题】:If condition inside case如果条件在情况下
【发布时间】:2013-01-10 08:45:50
【问题描述】:

我正在将一些 MySQL 5.0 函数转换为 Oracle 11g。

我需要在一个案例中放置一个IF,但出现错误(缺少右括号) 这是我的代码

SELECT SUM(
    CASE PTIPO
      WHEN 0 THEN (SELECT IF(A.NT = 0) THEN A.VALOR ELSE 0 END IF FROM DUAL)
      WHEN 1 THEN (SELECT IF(A.NT = 1) THEN A.VALOR ELSE 0 END IF FROM DUAL)
      WHEN 2 THEN (SELECT IF(A.NT = 1) THEN A.VALOR ELSE -A.VALOR END IF FROM DUAL)
    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

【问题讨论】:

    标签: mysql sql oracle oracle11g


    【解决方案1】:

    IF / ELSE 用于函数内部的流控制和准备好的语句,而不是用于在单个语句中组装条件。

    真的,您只需要使用其他语法格式CASE WHEN <condition> THEN <value> 在内部嵌套另一个CASE

    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
    

    【讨论】:

    • 这种风格很适合我。感谢您提供好的简单示例和答案。
    【解决方案2】:

    你可以改写为:

    SELECT SUM(
        CASE 
          WHEN PTIPO = 0 and A.NT  = 0 THEN A.VALOR 
          WHEN PTIPO = 0 and A.NT <> 0 THEN 0
          WHEN PTIPO = 1 and A.NT  = 1 THEN A.VALOR 
          WHEN PTIPO = 1 and A.NT <> 1 THEN 0
          WHEN PTIPO = 2 and A.NT  = 1 THEN A.VALOR 
          WHEN PTIPO = 2 and A.NT <> 1 THEN -A.VALOR 
        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
    

    【讨论】:

    • 德纳达,亚历杭德罗。 Parece que esta pregunta he tenido mejor aceptación que la anterior ... ;)
    猜你喜欢
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    相关资源
    最近更新 更多