【问题标题】:Where Clause Case Statement; ORA-00907: missing parenthesisWhere 子句案例陈述; ORA-00907: 缺少括号
【发布时间】:2013-08-28 09:28:12
【问题描述】:

我有一个查询,当我运行它时,我收到错误消息 ORA-00907:缺少括号。当我将 CASE 语句替换为 x = g andy = g and 时,它会按预期运行。

SELECT *
FROM
table1,
table2,
table3,
table4,
table5,
table6,
table7,
table8
WHERE
a = b and
c = d and
e = d and
CASE strfldvar
    WHEN 'BROKEN_ARROW' THEN (x = g)
    WHEN 'BROKEN_BOX'   THEN (y = g)
ELSE -1
end 
and
f = h and
i = j

我在这里做错了什么?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    case 是一个表达式,而不是一个谓词(即条件):它“返回”一个类型化的值,并且不能包含谓词作为结果(在 then 部分中)。在您的情况下(假设 else -1 表示“不匹配”):

    AND g = CASE strfldvar
      WHEN 'BROKEN_ARROW' THEN x
      WHEN 'BROKEN_BOX'   THEN y 
      ELSE NULL -- never match, even if g is null
    END
    

    虽然我认为将其替换为:

    AND (
         (strfldvar = 'BROKEN_ARROW' AND x = g) 
      OR (strfldvar = 'BROKEN_BOX' AND y = g)
    )
    

    【讨论】:

      【解决方案2】:

      代替

      CASE strfldvar
          WHEN 'BROKEN_ARROW' THEN (x = g)
          WHEN 'BROKEN_BOX'   THEN (y = g)
      ELSE -1
      

      有这个:

      x=CASE strfldvar WHEN 'BROKEN_ARROW' THEN g ELSE x END
      y=CASE strfldvar WHEN 'BROKEN_ARROW' THEN g ELSE y END
      

      【讨论】:

        【解决方案3】:

        我会替换

        CASE strfldvar
            WHEN 'BROKEN_ARROW' THEN (x = g)
            WHEN 'BROKEN_BOX'   THEN (y = g)
        ELSE -1
        

        通过

        (CASE WHEN strfldvar = 'BROKEN_ARROW' and x = g then 1 
              WHEN strfldvar = 'BROKEN_BOX' and y = g then 1
              ELSE -1
              END) = 1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-23
          • 2018-12-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多