1

取得したいcommission値よりも大きい場合は、オラクルで何かを取得しようとしますが、そうでない場合は. また、取得したい場合。それが であることは知っていますが、構文に何か問題があります。手伝って頂けますか?0.2'GOOD''BAD'commission is null0NVL

SELECT LAST_NAME,
       SALARY,
       DECODE(
              NVL(COMMISSION_PCT),
              COMMISSION_PCT < 0,2, 'BAD', COMMISSION_PCT > 0,2, 'GOOD'
            ) CommissionResult
FROM EMPLOYEES;
4

2 に答える 2

6

まず、ではなく0.2と書くべきです。しかし、最も重要なことは、このケースには適していません。0.20,2decode

この場合 (および、decode を使用できる他のすべての場合) を使用できますこれcaseは、より柔軟で冗長であるため、読みやすくなります。

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;

この場合、NULLパーセンテージが正確に 0.2 のときに得られます。ELSE代わりに節が必要なだけかもしれません:

SELECT LAST_NAME,SALARY,
CASE WHEN NVL(COMMISSION_PCT) < 0.2 THEN
  'BAD'
ELSE
  'GOOD'
END as CommissionResult
FROM EMPLOYEES;
于 2015-11-01T07:51:24.270 に答える
1
DECODE(
          NVL(COMMISSION_PCT),
          COMMISSION_PCT < 0,2,'BAD',COMMISSION_PCT > 0,2,'GOOD'
        )

クエリは構文的に正しくありません。

  • NVL構文が不完全です
  • 10 進数のタイプミス、ドットの代わりにコンマがあります。
  • DECODE構文は比較をサポートしていません。

必要に応じて、冗長で解釈しやすいCASE式を使用できます。

ケースの使用

たとえば、SCOTT スキーマで標準のEMPテーブルを使用すると、次のようになります。

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.

ただし、DECODEを使用する必要がある場合は、 SIGNを使用して同じ機能を持たせる必要があります。

デコードの使用

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.
于 2015-11-01T07:56:12.507 に答える