Почему это выражение CASE выдает ошибку «несовместимые типы данных»? - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь вернуть целое число, если условие ложно, и строку, если условие истинно.

SELECT 
    ENAME, 
    CASE WHEN COMM IS NULL THEN 'no commission' 
        ELSE COMM
    END AS COMMISSION 
FROM EMP

Я получаю эту ошибку:

ORA-00932: inconsistent datatypes: expected CHAR got NUMBER

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Все типы данных во всех случаях должны соответствовать используемой вами структуре сравнения, например case..when, decode, nvl или nvl2. Я предлагаю вам использовать nvl или nvl2 для вашего случая, так как они более прямолинейны для случаев с нулевым значением:

SELECT ENAME, 
       nvl(to_char(COMM),'no commission') AS COMMISSION,
       nvl2(COMM,to_char(COMM),'no commission') AS COMMISSION2     
  FROM EMP;

SQL Fiddle Demo

0 голосов
/ 08 сентября 2018

Из справочника Oracle SQL Language 18c :

Как для простых, так и для поисковых выражений CASE все return_exprs должны иметь одинаковый тип данных (CHAR, VARCHAR2,NCHAR или NVARCHAR2, NUMBER, BINARY_FLOAT или BINARY_DOUBLE) или все они должны иметь числовой тип данных.Если все возвращаемые выражения имеют числовой тип данных, Oracle определяет аргумент с наивысшим числовым приоритетом, неявно преобразует остальные аргументы в этот тип данных и возвращает этот тип данных.

Тип данных ofстроковым литералом 'no Commission' является VARCHAR2, а столбец COMM представляется числовым типом данных, поэтому выдается ошибка.

Вы можете преобразовать возвращаемое значение COMM в предложении else в VARCHAR2, чтобы избежатьэта ошибка.Я думаю, что лучший способ сделать это - использовать функцию TO_CHAR , потому что это позволяет вам контролировать формат отображаемых чисел.

0 голосов
/ 08 сентября 2018

Вам нужно использовать CAST:

SELECT ENAME, CASE WHEN COMM IS NULL THEN 'no commission' 
                   ELSE CAST(COMM AS VARCHAR2(20)) END AS COMMISSION 
FROM EMP;

Или используйте COALESCE:

SELECT ENAME, COALESCE(CAST(COMM AS VARCHAR2(20)), 'no commision')
FROM EMP;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...