2014-11-05 117 views
1

我在这里做错了什么我不能为我的生活弄清楚这一点我知道它不能是这个硬的权利?WHERE语句中的PL/SQL条件语句

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

请帮助

+0

在你的问题中没有PL/SQL – 2014-11-05 18:21:49

+0

解释一些你想做什么,只是用代码我不知道如何帮助你。如果有帮助,请查看PL-SQL中的CASE语句:http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/case_statement.htm – 2014-11-05 18:26:40

+0

你想达到什么目的?这个查询应该做什么? – Mureinik 2014-11-05 18:27:38

回答

1

滑稽。今天一个同事的问题完全一样。你是他吗? :)

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

但是,您可以使用AND将您想要的条件与具有特定“语法”的“前提条件”结合起来。很难说清楚,但查询应该看起来像这样:

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 
) 

是更好,更快?我不知道。更可读?在这种情况下,也许不是,但我不能伤害到这样的伎俩。请注意,此查询与前一个稍有不同。另一个没有捕获除> =,< =和NULL之外的语法,而这个语句将每个不是'< ='的语法退回到前向范围。

+0

大声笑我希望我问/我的同事这件事,他只帮我分手;但你的例子像一个冠军!万分感谢!!! – Th0raxe 2014-11-05 19:04:19