Sql ORACLE-TO_数函数
我的表中有一列Sql ORACLE-TO_数函数,sql,oracle,type-conversion,Sql,Oracle,Type Conversion,我的表中有一列TEXT\u INT,我想使用to\u NUMBER函数将其转换为十进制。不幸的是,我越来越 无效号码ORA-722错误 我怀疑里面可能有人物。因此,在下面的查询中发出,但TEXT\u INT中没有字母 SELECT * FROM NANTHA_TABLE WHERE UPPER(TEXT_INT) != LOWER(TEXT_INT); 请提供解决此问题的方法或查找错误数据的方法?此查询可能会对您有所帮助 select your_wrong_col , cas
TEXT\u INT
,我想使用to\u NUMBER函数将其转换为十进制。不幸的是,我越来越
无效号码ORA-722错误
我怀疑里面可能有人物。因此,在下面的查询中发出,但TEXT\u INT
中没有字母
SELECT *
FROM NANTHA_TABLE
WHERE UPPER(TEXT_INT) != LOWER(TEXT_INT);
请提供解决此问题的方法或查找错误数据的方法?此查询可能会对您有所帮助
select your_wrong_col ,
case
when trim(TRANSLATE(your_wrong_col ,'0123456789','')) is null
then 'numeric'
else 'not_numeric'
end as your_wrong_col
from YOUR_TABLE
where trim(TRANSLATE(your_wrong_col ,'0123456789','')) is not null;
查找非数字行。此查询可能对您有所帮助
select your_wrong_col ,
case
when trim(TRANSLATE(your_wrong_col ,'0123456789','')) is null
then 'numeric'
else 'not_numeric'
end as your_wrong_col
from YOUR_TABLE
where trim(TRANSLATE(your_wrong_col ,'0123456789','')) is not null;
查找非数字行。尝试以下操作:
创建如下函数:
CREATE OR REPLACE function f_invalid_number(number_field in varchar2) return number as
n_d number;
begin
n_d := TO_number(number_field);
return 0;
exception
when others then
return 1;
end;
/
SELECT *
FROM NANTHA_TABLE
WHERE f_invalid_number(TEXT_INT) =1
然后,您可以像这样检查无效数据:
CREATE OR REPLACE function f_invalid_number(number_field in varchar2) return number as
n_d number;
begin
n_d := TO_number(number_field);
return 0;
exception
when others then
return 1;
end;
/
SELECT *
FROM NANTHA_TABLE
WHERE f_invalid_number(TEXT_INT) =1
试试这个:
创建如下函数:
CREATE OR REPLACE function f_invalid_number(number_field in varchar2) return number as
n_d number;
begin
n_d := TO_number(number_field);
return 0;
exception
when others then
return 1;
end;
/
SELECT *
FROM NANTHA_TABLE
WHERE f_invalid_number(TEXT_INT) =1
然后,您可以像这样检查无效数据:
CREATE OR REPLACE function f_invalid_number(number_field in varchar2) return number as
n_d number;
begin
n_d := TO_number(number_field);
return 0;
exception
when others then
return 1;
end;
/
SELECT *
FROM NANTHA_TABLE
WHERE f_invalid_number(TEXT_INT) =1
请使用下面的查询查找TEXT_INT列包含除number以外的字符的记录
select * from NANTHA_TABLE where NOT REGEXP_LIKE(TEXT_INT,'^[0-9]+$')
如果您希望列中包含更多应视为有效的字符串符号,您可以将它们包含在类似NOT REGEXP_的条件中,以便这些列也不会出现在查询中
例如,如果某些值的字符串开头需要一个“-”符号:
NOT REGEXP_LIKE(COLUMN_NAME, '^-?[0-9.]+$') "
在哪里
- "(二)开始
- “?”零或一次发生
- “+”还有一种情况
- 字符串结尾“$”
LENGTH(COLUMN_NAME) - LENGTH(REPLACE(COLUMN_NAME,'.','')) > 1
要查找有关REGEXP\u LIKE的更多详细信息,请使用。请使用下面的查询查找TEXT\u INT列包含除number以外的字符的记录
select * from NANTHA_TABLE where NOT REGEXP_LIKE(TEXT_INT,'^[0-9]+$')
如果您希望列中包含更多应视为有效的字符串符号,您可以将它们包含在类似NOT REGEXP_的条件中,以便这些列也不会出现在查询中
例如,如果某些值的字符串开头需要一个“-”符号:
NOT REGEXP_LIKE(COLUMN_NAME, '^-?[0-9.]+$') "
在哪里
- "(二)开始
- “?”零或一次发生
- “+”还有一种情况
- 字符串结尾“$”
LENGTH(COLUMN_NAME) - LENGTH(REPLACE(COLUMN_NAME,'.','')) > 1
要查找有关REGEXP_LIKE的更多详细信息,请使用。查看本文,这对您的案例非常有用。您的一些记录中可能没有字符,只有空格。请添加您在问题中尝试过的查询。从regexp(TEXT_INT,[^0-9])喜欢的NANTHA_表中选择*;你能告诉我这个查询的o/p吗?你需要使用Oracle的
正则表达式函数来解决这个问题,因为其他解决方案不能正确处理像“12+3”这样的字符串,或者像@KeyurPanchal提到的,只有空白字符的字符串或者有制表符的字符串等等。捕获所有问题的正则表达式
并不太难。请记住,字符串“1e3”是可以转换为数字的字符串。这就是为什么您需要RE,因为有效数字的整个规范很长,但是使用REs更容易。将数字存储在字符串中是一个多么糟糕的主意。此列允许包含什么内容?只有数字?前导减号?前导加号?尾随的减号?一千个分离器?一个公式?(我认为您不允许使用十进制分隔符,因为该列称为int。)检查本文,这将非常适合您的情况。您的一些记录中可能没有字符,只有空格。请添加您在问题中尝试过的查询。从regexp(TEXT_INT,[^0-9])喜欢的NANTHA_表中选择*;你能告诉我这个查询的o/p吗?你需要使用Oracle的正则表达式函数来解决这个问题,因为其他解决方案不能正确处理像“12+3”这样的字符串,或者像@KeyurPanchal提到的,只有空白字符的字符串或者有制表符的字符串等等。捕获所有问题的正则表达式
并不太难。请记住,字符串“1e3”是可以转换为数字的字符串。这就是为什么您需要RE,因为有效数字的整个规范很长,但是使用REs更容易。将数字存储在字符串中是一个多么糟糕的主意。此列允许包含什么内容?只有数字?前导减号?前导加号?尾随的减号?一千个分离器?一个公式?(我认为您不允许使用小数分隔符,因为该列称为int。)符号/千分隔符/小数点如何?全部有效。或科学记数法。符号/千位分隔符/小数点如何?都是有效的。或者是科学符号。不错,但它并没有涵盖一个词的全部定义。这就是我喜欢PL/SQL函数方法的原因。Oracle可以更改其定义,PL/SQL函数将继续工作,而RE方法可能必须更改,但至少必须重新访问。@Jeff6次7我理解这一点。我喜欢我的方法,因为它更开放。我们看到OP使用字符串列作为数字,而不是创建数字列,这可能表明hes/[或创建它的人]希望在该列中的数字中添加一些额外的特殊字符。无论如何这是不可能的。只是想提出一个更开放的解决方案。不过,我也同意PL/SQL函数的方法进行更传统的数字检查。@WernfriedDomscheit请阅读我的全部答案。我也解释了十进制挑战。我们可以将REGEXP和decimal count查询结合在一起。不错,但它并没有涵盖一个函数的整个定义。这就是为什么我喜欢李