首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle SQL比较via解码

Oracle SQL比较via解码
EN

Stack Overflow用户
提问于 2015-11-01 07:40:42
回答 2查看 6.7K关注 0票数 1

我试图在甲骨文中得到一些东西,如果commission大于0.2,我想得到'GOOD',否则是'BAD'。而且如果commission is null我想得到0。我知道NVL是这样的,但是语法出了问题。你能帮帮我吗?

代码语言:javascript
复制
SELECT LAST_NAME,
       SALARY,
       DECODE(
              NVL(COMMISSION_PCT),
              COMMISSION_PCT < 0,2, 'BAD', COMMISSION_PCT > 0,2, 'GOOD'
            ) CommissionResult
FROM EMPLOYEES;
EN

回答 2

Stack Overflow用户

发布于 2015-11-01 07:51:24

首先,0.2应该写成0.2,而不是0,2。但最重要的是,decode不适合这种情况。

在本例中(以及所有其他可以使用解码的情况下),您可以使用case,它更灵活、更详细,因此也更容易阅读。

代码语言:javascript
复制
SELECT LAST_NAME,SALARY,
CASE WHEN NVL(COMMISSION_PCT) < 0.2 THEN
  'BAD'
WHEN COMMISSION_PCT > 0.2 THEN 
  'GOOD'
END as CommissionResult
FROM EMPLOYEES;

在本例中,当百分比正好为0.2时,您将得到NULL。也许您只需要一个ELSE子句来代替:

代码语言:javascript
复制
SELECT LAST_NAME,SALARY,
CASE WHEN NVL(COMMISSION_PCT) < 0.2 THEN
  'BAD'
ELSE
  'GOOD'
END as CommissionResult
FROM EMPLOYEES;
票数 6
EN

Stack Overflow用户

发布于 2015-11-01 07:56:12

代码语言:javascript
复制
DECODE(
          NVL(COMMISSION_PCT),
          COMMISSION_PCT < 0,2,'BAD',COMMISSION_PCT > 0,2,'GOOD'
        )

您的查询在语法上不正确。

  • NVL语法不完整
  • 小数中有一个错误,一个逗号,而不是点。
  • 解码语法不支持比较。

对于您的需求,您可以使用CASE表达式,该表达式冗长且易于解释。

使用CASE

例如,在SCOTT模式中使用标准的EMP表:

代码语言:javascript
复制
SQL> SELECT ename,
  2    sal,
  3    CASE
  4      WHEN NVL(comm, 0) < 0.2
  5      THEN 'BAD'
  6      WHEN NVL(comm, 0) > 0.2
  7      THEN 'GOOD'
  8    END CommissionResult
  9  FROM emp;

ENAME             SAL COMM
---------- ---------- ----
SMITH             800 BAD
ALLEN            1600 GOOD
WARD             1250 GOOD
JONES            2975 BAD
MARTIN           1250 GOOD
BLAKE            2850 BAD
CLARK            2450 BAD
SCOTT            3000 BAD
KING             5000 BAD
TURNER           1500 BAD
ADAMS            1100 BAD
JAMES             950 BAD
FORD             3000 BAD
MILLER           1300 BAD

14 rows selected.

但是,如果必须使用解码,则需要使用SIGN来具有相同的功能。

使用解码

代码语言:javascript
复制
SQL> SELECT ename,
  2    sal,
  3    DECODE( SIGN(NVL(comm, 0) - 0.2), -1, 'BAD', +1, 'GOOD') CommissionResult
  4  FROM emp;

ENAME             SAL COMM
---------- ---------- ----
SMITH             800 BAD
ALLEN            1600 GOOD
WARD             1250 GOOD
JONES            2975 BAD
MARTIN           1250 GOOD
BLAKE            2850 BAD
CLARK            2450 BAD
SCOTT            3000 BAD
KING             5000 BAD
TURNER           1500 BAD
ADAMS            1100 BAD
JAMES             950 BAD
FORD             3000 BAD
MILLER           1300 BAD

14 rows selected.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33460173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档