我正在尝试清理一个大约有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=,.') 对如何清理数据有什么建议吗?
发布于 2019-01-16 04:52:35
如果您安装此函数,请列出: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;发布于 2019-01-16 05:40:10
不使用函数的简单解决方案是在转换之前使用正则表达式剥离非数字字符,例如:
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.]')之类的东西来捕获字符串中的第一个数字。
https://stackoverflow.com/questions/54206578
复制相似问题