Простым решением без использования функции было бы использование регулярного выражения для удаления нечисловых символов перед преобразованием, например:
TO_NUMBER(
NVL(REGEXP_REPLACE(score, '[^1-9.]', ''), 0),
'9999D99',
'nls_numeric_characters='.'
)
Объяснение регулярного выражения:
[ # any character
^ # other than
1-9 # 1, 2, 3, ..., 9
. # and character . (dot)
]
Примечание: если у вас есть числа в нескольких местах в строке, они в конечном итоге соединяются вместе, а затем преобразуются в число. В вашем случае есть и другие возможные варианты, например, использовать что-то вроде REGEXP_SUBSTR(score, '[1-9.]')
, чтобы захватить первое число в строке.