Oracle文档中的表达式中缺少括号?

时间:2017-12-06 17:41:51

标签: oracle

在Oracle SQL文档中找到了这个条件:

NVL(salary, 0) + NVL(salary + (salary*commission_pct, 0) > 25000)

https://docs.oracle.com/database/122/SQLRF/About-SQL-Conditions.htm#SQLRF52101

它解释说,“以下复杂条件将工资值添加到commission_pct值(将值0替换为null)并确定总和是否大于数字常量25000:”。 但是当我尝试执行它时,它会抛出一个错误,

  

'缺少正确的父母'。

这个条件有效吗?还是有其他方法来执行它。

SELECT  NVL(salary, 0) + NVL(salary + (salary*commission_pct, 0) > 25000) FROM HR.Employees;

任何帮助将不胜感激,谢谢。

3 个答案:

答案 0 :(得分:2)

该条件旨在用于WHERE子句,而不是SELECT

SELECT e.*
FROM HR.Employees
WHERE NVL(salary, 0) + NVL(salary + salary*commission_pct, 0) > 25000 ;

(这也会调整括号。)

两次加薪是没有意义的。据推测,预期的逻辑是:

WHERE NVL(salary, 0) + NVL(salary*commission_pct, 0) > 25000 ;

但是,我会把它写成:

SELECT e.*
FROM HR.Employees
WHERE COALESCE(salary, 0) * (1 + COALESCE(commission_pct, 0)) > 25000 ;

答案 1 :(得分:2)

这似乎是一个文档错误;即使在12cR2 documentation它仍然说:

NVL(salary, 0) + NVL(salary + (salary*commission_pct, 0) > 25000)

而不是

NVL(salary, 0) + NVL(salary*commission_pct, 0) > 25000

NVL(salary + salary*commission_pct, 0) > 25000

或(更接近原版,虽然这看起来像是一件奇怪的事情想要找到)

NVL(salary, 0) + NVL(salary + salary*commission_pct, 0) > 25000

或其他一些有效的变体,取决于它应该检查的内容......

正如其他人已经指出它是条件,所以它进入where子句,而不是选择列表。

答案 2 :(得分:0)

即可。在撰写此答案时,这是一个文档错误。

你应该在where子句中使用这个条件,而不是选择,删除一些大括号。

<html>
<head>
<style type="text/css">
header { 
	position:relative; 
	z-index:5; 
	
}
.dropdown { 
	background-color: yellow;
	width: 100px;
	height: 100px;
	position: absolute;
	z-index: -1;
}
.background { 
	position: absolute;
	background-color:#ccca; 
	border-bottom: 1px solid black;
	width: 100%;
	height: 50px;
	z-index: auto;
}
</style>
</head>
<body>
<header> 
	<div class="background">
		<div class="dropdown">
		</div>
	</div>
</header>
</body>
</html>

然而,这是一个比较合适的逻辑。

SELECT
    *
FROM
    hr.employees
WHERE
    nvl(salary,0) + nvl(salary + salary * commission_pct,0) > 25000;