问题描述
SELECT * FROM TEST_TABLE
WHERE CHAR_FIELD = CASE
WHEN KEY_FIELD = 'Q'
THEN 'M'
ELSE
CASE
WHEN KEY_FIELD = 'T'
THEN 'K'
ELSE CHAR_FIELD2
END
END;
这:
SELECT * FROM TEST_TABLE
WHERE CHAR_FIELD = CASE
WHEN KEY_FIELD = 'Q'
THEN 'M'
ELSE
CASE
WHEN KEY_FIELD <> 'T'
THEN CHAR_FIELD2
ELSE 'K'
END
END;
我希望两个查询在所有情况下都返回相同的数据,但是,第一个给我一个ORA-43914“无法确定排序规则:参数具有未定义的排序规则”错误,而第二个则很好。
我阅读了this中有关Oracle中排序规则确定的信息,但我不清楚它与大小写表达式一起工作的方式。
感谢您的帮助。
解决方法
问题在于KEY_FIELD
是NULL
时。在这种情况下,两个查询中的第二个CASE
总是转到ELSE
。
也就是说,我发现CASE
表达式使逻辑过于复杂。我更喜欢简单的布尔操作:
WHERE (CHAR_FIELD = 'M' AND KEY_FIELD = 'Q') OR
(CHAR_FIELD = 'K' AND KEY_FIELD = 'T') OR
(CHAR_FIELD = 'K' AND KEY_FIELD NOT IN ('Q','T'))
这实际上并不处理NULL
中的KEY_FIELD
值。那必须要明确地处理。