Есть ли функция, которая возвращает значение по умолчанию для строки, которая не является допустимым числом - PullRequest
0 голосов
/ 22 мая 2018

Я хотел бы знать, есть ли функция nvl для буквенных символов, или я должен использовать регистр в операторе выбора?

Пример:

EMPNO 
-----  
73A69
7369B
C7369
7369
736,9
73,69
73e,69
73,e69

Я хочуполучить это в результате:

0
0
0
7369
736,9
73,69

Ответы [ 5 ]

0 голосов
/ 25 мая 2018

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

SELECT 
  CASE WHEN REGEXP_LIKE(empno, '^[0-9]+([\,\.][0-9]+)?$')
   THEN TO_NUMBER(empno) ELSE 0 END
FROM emp;

, но это не даст ни запятой, ни точкой, потому что СУБД по умолчанию не интерпретирует оба как десятичный разделитель.

ВыКонечно, можно просто выбрать строку:

SELECT 
  CASE WHEN REGEXP_LIKE(empno, '^[0-9]+([\,\.][0-9]+)?$')
   THEN empno ELSE '0' END
FROM emp;

Если вам нужно выбрать строку, преобразованную в число, сделайте строку последовательной (т.е. замените точку запятой или наоборот) и отобразите соответствующий форматпри использовании TO_CHAR:

SELECT 
  CASE WHEN REGEXP_LIKE(empno, '^[0-9]+([\,\.][0-9]+)?$') 
    THEN TO_NUMBER(REPLACE(empno, ',', '.'), '90.9999999') ELSE 0 END
FROM emp;

Соответственно, начиная с Oracle 12c Release 2 вы можете использовать:

SELECT TO_NUMBER(REPLACE(empno, ',', '.') DEFAULT 0 ON CONVERSION ERROR, '90.9999999')
FROM emp;

(Этот последний запрос, однако, мог бы принять '12,' и '12.' как действительные числа (а именно как число 12), что запрещено регулярным выражением.)

0 голосов
/ 23 мая 2018

это мое окончательное решение

    SELECT CASE WHEN REGEXP_LIKE(empno, '^[0-9]+([\,\.][0-9]+)?$') THEN 
        TO_NUMBER(empno) ELSE 0 END
      FROM   emp;
0 голосов
/ 22 мая 2018

Я не уверен, почему вы называете это nvl, но если вы просто пытаетесь преобразовать нечисловую строку в 0, я бы действительно использовал выражение case сregexp_like вызов:

SELECT CASE WHEN REGEXP_LIKE(empno, '^[0-9]+$') THEN TO_NUMBER(empno) ELSE 0 END
FROM   emp;
0 голосов
/ 22 мая 2018

Oracle 12cR2 и выше:

select TO_NUMBER ( EMPNO DEFAULT 0 ON CONVERSION ERROR ) FROM t;
0 голосов
/ 22 мая 2018

Вы ищете регулярное выражение?

select (case when regexp_like(empno, '[^0-9,]' then 0 else empno end)

Если вы хотите избежать case, вы можете играть в такие хитрости, как:

select coalesce(regexp_substr(empno, '^[0-9,]+$', 1, 1), '0')

Но это по сутита же логика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...