查找Oracle中不包含数字数据的行

Ben*_*Ben 17 sql oracle varchar numeric varchar2

我试图在一个非常大的Oracle表中找到一些有问题的记录.该列应包含所有数字数据,即使它是varchar2列.我需要找到不包含数字数据的记录(当我尝试在此列上调用它时,to_number(col_name)函数会引发错误).

SGB*_*SGB 20

我以为你可以使用regexp_like条件并使用正则表达式来查找任何非数字.我希望这可能会有所帮助?!

SELECT * FROM table_with_column_to_search WHERE REGEXP_LIKE(varchar_col_with_non_numerics, '[^0-9]+');
Run Code Online (Sandbox Code Playgroud)


Mic*_*ant 12

要获得指标:

DECODE( TRANSLATE(your_number,' 0123456789',' ')
Run Code Online (Sandbox Code Playgroud)

例如

SQL> select DECODE( TRANSLATE('12345zzz_not_numberee',' 0123456789',' '), NULL, 'number','contains char')
 2 from dual
 3 /

"contains char"
Run Code Online (Sandbox Code Playgroud)

SQL> select DECODE( TRANSLATE('12345',' 0123456789',' '), NULL, 'number','contains char')
 2 from dual
 3 /

"number"
Run Code Online (Sandbox Code Playgroud)

SQL> select DECODE( TRANSLATE('123405',' 0123456789',' '), NULL, 'number','contains char')
 2 from dual
 3 /

"number"
Run Code Online (Sandbox Code Playgroud)

Oracle 11g具有正则表达式,因此您可以使用它来获取实际数字:

SQL> SELECT colA
  2  FROM t1
  3  WHERE REGEXP_LIKE(colA, '[[:digit:]]');

COL1
----------
47845
48543
12
...
Run Code Online (Sandbox Code Playgroud)

如果有一个非数字值,如'23g',它将被忽略.


ciu*_*uly 5

与SGB的答案相反,我更喜欢使用正则表达式定义数据的实际格式并否定它.这允许我定义像$ DDD,DDD,DDD.DD这样的值在OPs的简单场景中,它看起来像

SELECT * 
FROM table_with_column_to_search 
WHERE NOT REGEXP_LIKE(varchar_col_with_non_numerics, '^[0-9]+$');
Run Code Online (Sandbox Code Playgroud)

它找到所有非正整数.如果你也接受negatiuve整数,这是一个简单的改变,只需添加一个可选的前导减号.

SELECT * 
FROM table_with_column_to_search 
WHERE NOT REGEXP_LIKE(varchar_col_with_non_numerics, '^-?[0-9]+$');
Run Code Online (Sandbox Code Playgroud)

接受浮点数......

SELECT * 
FROM table_with_column_to_search 
WHERE NOT REGEXP_LIKE(varchar_col_with_non_numerics, '^-?[0-9]+(\.[0-9]+)?$');
Run Code Online (Sandbox Code Playgroud)

任何格式都是如此.基本上,您通常已经具有验证输入数据的格式,因此当您希望找到与该格式不匹配的数据时...否则会更容易否定该格式而不是另一种格式; 如果你想要的不仅仅是正整数,那么在SGB方法的情况下做起来会有点棘手.