sql >> Database teknologi >  >> RDS >> Oracle

Kan ikke SUM(TO_NUMBER(varchar2 felt)) :ORA 01722 [ORACLE]

Hvis du får den fejl fra en streng som 13.5 derefter din sessions NLS_NUMERIC_CHARACTERS ser ud til at være indstillet til at bruge et komma som decimalseparator:

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

Du kan enten udtrykkeligt indstille sessionen til at bruge et punktum som decimalseparator eller angive en formatmaske, der bruger et punktum:

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

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

Eller brug decimalseparatormarkøren i modellen og tilsidesæt sessionens NLS-indstilling:

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

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

Masken skal naturligvis være egnet til alle de værdier, du forventer tilbage fra dit regex; Det, jeg har brugt, er måske ikke helt rigtigt for dine data.

Denne form for problem er, hvorfor du ikke bør gemme tal eller datoer som strenge. Brug den korrekte datatype til dine kolonner.




  1. Er der nogen god måde at fejlsøge streng på, eller binære data vil blive afkortet?

  2. Henter tilfældige data fra en MySQL-database, men gentager ikke data

  3. mens loop og join output i mysql php

  4. PHP MySQL finde det mindste manglende tal i kolonnen