sql >> Databáze >  >> RDS >> Oracle

Nelze SUM(TO_NUMBER(pole varchar2)) :ORA 01722 [ORACLE]

Pokud tuto chybu dostáváte z řetězce jako 13.5 pak NLS_NUMERIC_CHARACTERS vaší relace Zdá se, že je nastaveno použití čárky jako oddělovač desetinných míst:

alter session set nls_numeric_characters=',.';

with your_table (bikou) as (
  select '10' from dual
  union all select '12' from dual
  union all select '13.5' from dual
  union all select null from dual
)
select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', '')))
from your_table;

SQL Error: ORA-01722: invalid number

Můžete buď explicitně nastavit relaci tak, aby používala jako oddělovač desetinných míst tečku, nebo poskytnout masku formátu, která používá tečku:

select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''), '99999999.99999'))
from your_table;

SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:
---------------------------------------
                                   35,5

Nebo použijte značku oddělovače desetinných míst v modelu a přepište nastavení NLS relace:

select SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:alpha:]]', ''),
  '99999999D99999', 'nls_numeric_characters=''.,'''))
from your_table;

SUM(TO_NUMBER(REGEXP_REPLACE(BIKOU,'[[:
---------------------------------------
                                   35,5

Maska samozřejmě musí být vhodná pro všechny hodnoty, které očekáváte od svého regulárního výrazu; to, co jsem použil, nemusí být zcela vhodné pro vaše data.

Tento druh problému je důvodem, proč byste neměli ukládat čísla nebo data jako řetězce. Použijte pro své sloupce správný datový typ.




  1. Objekt třídy yii\db\Command nelze převést na řetězec

  2. přidat index do pole jsonb

  3. MySQL:použít hodnotu z jiné tabulky jako alias sloupce?

  4. SQL:velké pouze první písmeno