CASE WHEN表达式中的Oracle错误43914:参数具有未定义的排序规则

问题描述

我想知道此查询间的区别:

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_FIELDNULL时。在这种情况下,两个查询中的第二个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值。那必须要明确地处理。