滑稽。今天一个同事的问题完全一样。你是他吗? :)
在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之外的语法,而这个语句将每个不是'< ='的语法退回到前向范围。
在你的问题中没有PL/SQL – 2014-11-05 18:21:49
解释一些你想做什么,只是用代码我不知道如何帮助你。如果有帮助,请查看PL-SQL中的CASE语句:http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/case_statement.htm – 2014-11-05 18:26:40
你想达到什么目的?这个查询应该做什么? – Mureinik 2014-11-05 18:27:38