WHERE语句中的PL / SQL Condition语句

时间:2014-11-05 18:21:07

标签: sql oracle11g

我在这里做错了什么我不能为我的生活搞清楚这一点我知道这不是很难吗?

SELECT SCALED_SCORE 
FROM NEUROCOG.SCALED_SCORE_RAW 
WHERE DDID = 2737

AND (CASE 

  WHEN SYNTAX = '>=' THEN AND 6 BETWEEN RAW_SCORE_START AND RAW_SCORE_END;
  WHEN SYNTAX = '<=' THEN AND 6 BETWEEN RAW_SCORE_END AND RAW_SCORE_START;
  WHEN SYNTAX IS NULL THEN AND 6 BETWEEN RAW_SCORE_START AND RAW_SCORE_END;

END CASE);

请帮助

1 个答案:

答案 0 :(得分:1)

有趣。一位同事今天也有同样的问题。你是他吗? :)

你不能在where子句中有这样的条件。 case只能返回一个值(甚至不是布尔值/比较结果)。

但您可以使用AND将您想要的条件与“前提条件”相结合。具有某种语法&#39;。难以用语言表达,但查询应该如下所示:

SELECT SCALED_SCORE 
FROM NEUROCOG.SCALED_SCORE_RAW 
WHERE DDID = 2737
AND (
  (SYNTAX = '>=' AND 6 BETWEEN RAW_SCORE_START AND RAW_SCORE_END) OR
  (SYNTAX = '<=' AND 6 BETWEEN RAW_SCORE_END AND RAW_SCORE_START) OR
  (SYNTAX IS NULL AND 6 BETWEEN RAW_SCORE_START AND RAW_SCORE_END)
)

该查询是您似乎尝试的字面翻译。

稍微不同的方法也可以起作用。 BETWEEN .. AND ..需要两个数字表达式,每个表达式都可以是一个case语句,所以你可以这样写:

SELECT SCALED_SCORE 
FROM NEUROCOG.SCALED_SCORE_RAW 
WHERE DDID = 2737
AND (
  6 BETWEEN 
      CASE WHEN SYNTAX = '<=' THEN RAW_SCORE_END ELSE RAW_SCORE_START END 
    AND 
      CASE WHEN SYNTAX = '<=' THEN RAW_SCORE_START ELSE RAW_SCORE_END END 
)

它更好,更快吗?我不知道。更具可读性?在这种情况下可能没有,但是如果你有这样的伎俩我就不会受伤。请注意,此查询与前一个查询略有不同。另一个没有捕获除&gt; =,&lt; =和NULL之外的语法,而这个语法落后于每个没有&#39;&lt; =&#39;到前进的范围。