我正在尝试清理一个设计不良的表,该表具有大约12,000行。该表将用户输入的数据保存为varchar。我想知道是否有一种方法可以将整个列转换为浮点并删除多余的文本。该列具有空值,文本值和数字,均存储为文本。
| Score |
|---------|
| 1 |
| 2 |
| 2 |
| 3 |
| 300 EOW |
| 5.5 |
| (null) |
| N/A |
| 200 |
我尝试使用以下命令,但最终收到一个ORA-01722
错误。
TO_NUMBER(NVL(score,'0'),'9999D99','nls_numeric_characters=,.')
关于如何清理数据的任何建议?
答案 0 :(得分:0)
如果安装此功能列出: http://techonthenet.com/oracle/questions/isnumeric.php
然后,您可以拨打is_number
CASE WHEN is_number(<EXPRESSION>) = 1 THEN TO_NUMBER(<SAME EXPRESSION>) ELSE 0 END
参考功能:
CREATE FUNCTION is_number (p_string IN VARCHAR2)
RETURN INT
IS
v_new_num NUMBER;
BEGIN
v_new_num := TO_NUMBER(p_string);
RETURN 1;
EXCEPTION
WHEN VALUE_ERROR THEN
RETURN 0;
END is_number;
答案 1 :(得分:0)
不使用函数的简单解决方案是在转换之前使用正则表达式去除非数字字符,例如:
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.]')
之类的东西来捕获字符串中的第一个数字。