ORA-01722: неверный номер в выписке - PullRequest
0 голосов
/ 17 апреля 2019

Привет, я новичок в базе данных Oracle. В приведенном ниже запросе ZERO_BAL_CODE - это varchar2 тип данных.Я пытался написать заявление о кейсе, но выдает ошибку, утверждающую, что "ORA-01722: invalid number".Помогите мне решить эту проблему.Заранее спасибо.

  SELECT id_loan,
         MAX (TO_NUMBER (delinq_status)) AS delinq_status,
         MAX (loan_age) AS loan_age,
         MAX (zero_bal_code) AS zero_bal_code,
         MAX (vintage) AS vintage,
         MIN (actual_loss) AS actual_loss,
         MIN (NULLIF (current_upb, 0)) AS current_upb,
         loan_type
    FROM (SELECT master_copy.id_loan,
                 loan_age,
                 master_copy.vintage,
                 delinq_status,
                 zero_bal_code,
                 master_copy.actual_loss,
                 current_upb,
                 CASE
                    WHEN (zero_bal_code IN (3)) THEN 'default_foreclosure'
                    WHEN (zero_bal_code IN (1)) THEN 'prepaid'
                    WHEN (zero_bal_code IN (6)) THEN 'default_reo'
                    WHEN (zero_bal_code IN (9)) THEN 'active'
                 END
                    AS loan_type
            FROM master_copy
                 INNER JOIN (SELECT id_loan FROM master_copy) a
                    ON master_copy.id_loan = a.id_loan) b
GROUP BY id_loan, loan_type;

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Вы не опубликовали описание таблицы, поэтому - для меня - это выглядит подозрительно:

MAX (TO_NUMBER (delinq_status)) AS delinq_status,

Если бы DELINQ_STATUS тип данных столбца был NUMBER, вам бы не пришлось TO_NUMBER его,Если это VARCHAR2, то кто-то мог ввести в него 'ABC1234', что приведет к сбою функции TO_NUMBER.

Итак, если вы запустите это, каков результат?

select max(to_number(delinq_status)) from master_copy

Начиная с пропущенных одинарных кавычек в CASE: идентификатор зависит от содержимого столбца.Если это «число», одинарные кавычки не нужны, хотя тип данных столбца VARCHAR2 (но это будет хорошая практика ; с другой стороны, если столбец содержит только числа, почему это не тип данных NUMBER?):

SQL> create table test (zero_bal_code varchar2(1));

Table created.

SQL> insert into test values ('1');

1 row created.

SQL> select case when zero_bal_code in (3) then 'default_foreclosure'
  2              else 'unknown'
  3         end loan_type
  4  from test;

LOAN_TYPE
-------------------
unknown

Однако, если есть что-то отличное от «чисел», то одинарные кавычки имеют значение:

SQL> insert into test values ('B');

1 row created.

SQL> select case when zero_bal_code in (3) then 'default_foreclosure'
  2              else 'unknown'
  3         end loan_type
  4  from test;
ERROR:
ORA-01722: invalid number



no rows selected

SQL> select case when zero_bal_code in ('3') then 'default_foreclosure'
  2              else 'unknown'
  3         end loan_type
  4  from test;

LOAN_TYPE
-------------------
unknown
unknown

SQL>

Кстати, то, что вы написали, не имеет особого смысла;коды для с предоплатой, default_reo и active действительно 1?Все они?Как вы будете различать, что есть что?

             CASE
                WHEN (zero_bal_code IN (3)) THEN 'default_foreclosure'
                WHEN (zero_bal_code IN (1)) THEN 'prepaid'
                WHEN (zero_bal_code IN (1)) THEN 'default_reo'
                WHEN (zero_bal_code IN (1)) THEN 'active'
             END
0 голосов
/ 17 апреля 2019

Попробуйте это с ':

  SELECT id_loan,
         MAX (TO_NUMBER (delinq_status)) AS delinq_status,
         MAX (loan_age) AS loan_age,
         MAX (zero_bal_code) AS zero_bal_code,
         MAX (vintage) AS vintage,
         MIN (actual_loss) AS actual_loss,
         MIN (NULLIF (current_upb, 0)) AS current_upb,
         loan_type
    FROM (SELECT master_copy.id_loan,
                 loan_age,
                 master_copy.vintage,
                 delinq_status,
                 zero_bal_code,
                 master_copy.actual_loss,
                 current_upb,
                 CASE
                    WHEN (zero_bal_code IN ('3')) THEN 'default_foreclosure'
                    WHEN (zero_bal_code IN ('1')) THEN 'prepaid'
                    WHEN (zero_bal_code IN ('1')) THEN 'default_reo'
                    WHEN (zero_bal_code IN ('1')) THEN 'active'
                 END
                    AS loan_type
            FROM master_copy
                 INNER JOIN (SELECT id_loan FROM master_copy) a
                    ON master_copy.id_loan = a.id_loan) b
GROUP BY id_loan, loan_type;
...