首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle:将VAXER列转换为浮点型

Oracle:将VAXER列转换为浮点型
EN

Stack Overflow用户
提问于 2019-01-16 04:48:05
回答 2查看 231关注 0票数 1

我正在尝试清理一个大约有12,000行的设计不佳的表。该表将用户输入的数据保存为varchar。我想知道是否有一种方法可以将整个列转换为浮点型,并剥离无关的文本。该列的空值、文本值和数字都存储为文本。

代码语言:javascript
运行
复制
| Score   |
|---------|
| 1       |
| 2       |
| 2       |
| 3       |
| 300 EOW |
| 5.5     |
| (null)  |
| N/A     |
| 200     |

我尝试使用以下命令,但最终收到ORA-01722错误。

代码语言:javascript
运行
复制
TO_NUMBER(NVL(score,'0'),'9999D99','nls_numeric_characters=,.') 

对如何清理数据有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2019-01-16 04:52:35

如果您安装此函数,请列出:http://techonthenet.com/oracle/questions/isnumeric.php

然后,您可以调用is_number

代码语言:javascript
运行
复制
CASE WHEN is_number(<EXPRESSION>) = 1 THEN TO_NUMBER(<SAME EXPRESSION>) ELSE 0 END

引用的函数:

代码语言:javascript
运行
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2019-01-16 05:40:10

不使用函数的简单解决方案是在转换之前使用正则表达式剥离非数字字符,例如:

代码语言:javascript
运行
复制
TO_NUMBER( 
    NVL(REGEXP_REPLACE(score, '[^1-9.]', ''), 0),
    '9999D99',
    'nls_numeric_characters='.'
)

正则表达式的解释:

代码语言:javascript
运行
复制
[        # any character
  ^      # other than
  1-9    # 1, 2, 3,  ..., 9
  .      # and character . (dot)
]

注意:如果字符串中有几个位置的数字,它们最终会连接在一起,然后转换为一个数字。对于您的用例,还有其他可能的选择,例如,使用REGEXP_SUBSTR(score, '[1-9.]')之类的东西来捕获字符串中的第一个数字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54206578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档