解码表达式和搜索的函数比较

时间:2015-06-09 13:49:12

标签: sql oracle

如果我给decode(1,2,3,4,5)它只显示空值我知道这是因为没有表达式与搜索值匹配所以返回默认值。但是我想要一个关于它如何匹配的解释。如果我给相同的函数decode(a,b,c,d,e)它返回无效的标识符e,为什么?

2 个答案:

答案 0 :(得分:1)

我怀疑你只需要将你的角色数据放入引号:

select decode('a','b','c','d','e') from dual

但你要求Oracle docs on DECODE

解释它是如何匹配的
  

如果expr和search是字符数据,那么Oracle使用非填充比较语义对它们进行比较。 expr,search和result可以是任何数据类型CHAR,VARCHAR2,NCHAR或NVARCHAR2。返回的字符串是VARCHAR2数据类型,与第一个结果参数的字符集相同。

     

如果第一个搜索结果对是数字,则Oracle会比较所有搜索结果表达式和第一个expr,以确定具有最高数字优先级的参数,隐式将剩余参数转换为该数据类型,并返回该数据类型。 / p>

编辑:"我想知道为什么它具体说e是无效整数而不是其他字符。"

它返回最后一个结果表达式的错误,而不仅仅是e。因此,如果你停在c或去g,你会得到最后的结果。我最好的猜测是它只是报告最后一个错误..可能是因为引擎解析的方式,可能会找到"最后一个"首先出错并报告。

事实上你用

看到了同样的事情
select a,b,c from dual

所以与解码无关。

答案 1 :(得分:1)

从你的评论Senthil,显然你不清楚它是DECODE的机制。我会尝试解释。

列表中的第一个元素是您要匹配的值。之后,我们处理成对的元素,如果匹配对中的第一个项目,则decode中返回的值是该对中的第二个项目。您可以根据需要配置多对配对。最后,如果找不到匹配项,您可以选择添加默认返回值。

item

由于1不等于2或4,因此返回空值。

如果您添加了最终的默认返回值,那么您将获得

So DECODE(a,b,c,d,e) means
Evaluate a. 
If a = b, return c
If a = d, return e.

So DECODE(1,2,3,4,5) is saying
Evaluate 1
 If 1=2, return 3
 If 1=4, return 5

这就是为什么我倾向于将我的调用格式化为DECODE以清楚地显示对。我会把它写成:

  DECODE(1,2,3,4,5,6)
Evaluate 1
 If 1=2, return 3
 If 1=4, return 5
 If no matches found, return 6.