Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ORACLE-TO_数函数_Sql_Oracle_Type Conversion - Fatal编程技术网

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.]+$') "  
在哪里

  • "(二)开始
  • “?”零或一次发生
  • “+”还有一种情况
  • 字符串结尾“$”
请注意,我知道我的上述查询中的小数即使计算两次也会被接受。为此,我提出了一种不同的解决方案来计算字符串中的小数数并抛出错误。如果有人能将其与REGEXP集成,那么我们非常欢迎您。如何计算要检查的小数位数

 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.]+$') "  
在哪里

  • "(二)开始
  • “?”零或一次发生
  • “+”还有一种情况
  • 字符串结尾“$”
请注意,我知道我的上述查询中的小数即使计算两次也会被接受。为此,我提出了一种不同的解决方案来计算字符串中的小数数并抛出错误。如果有人能将其与REGEXP集成,那么我们非常欢迎您。如何计算要检查的小数位数

 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查询结合在一起。不错,但它并没有涵盖一个函数的整个定义。这就是为什么我喜欢李