25

非常に大きな Oracle テーブルで問題のあるレコードを見つけようとしています。varchar2 列であっても、列にはすべて数値データが含まれている必要があります。数値データを含まないレコードを見つける必要があります (この列で to_number(col_name) 関数を呼び出そうとすると、エラーがスローされます)。

4

11 に答える 11

27

regexp_like条件を使用し、正規表現を使用して非数値を検索できると考えていました。これがお役に立てば幸いです。

SELECT * FROM table_with_column_to_search WHERE REGEXP_LIKE(varchar_col_with_non_numerics, '[^0-9]+');
于 2011-10-31T17:50:22.707 に答える
1

http://www.dba-oracle.com/t_isnumeric.htmから

LENGTH(TRIM(TRANSLATE(, ' +-.0123456789', ' '))) is null

TRIM の後に文字列に何かが残っている場合は、数字以外の文字でなければなりません。

于 2016-09-29T08:34:51.487 に答える
0

私はこれが便利だと思いました:

 select translate('your string','_0123456789','_') from dual

結果が NULL の場合、数値です (浮動小数点数は無視されます)。

ただし、アンダースコアが必要な理由に少し困惑しています。それがなければ、次も null を返します。

 select translate('s123','0123456789', '') from dual

私のお気に入りのトリックの 1 つもあります。文字列に "*" や "#" などのものが含まれている場合は完全ではありません。

 SELECT 'is a number' FROM dual WHERE UPPER('123') = LOWER('123')
于 2012-06-12T19:55:30.777 に答える
0

ここに画像の説明を入力問題のある列を並べて並べると、列のある行が見つかります。

SELECT 
 D.UNIT_CODE,
         D.CUATM,
         D.CAPITOL,
          D.RIND,
          D.COL1  AS COL1


FROM
  VW_DATA_ALL_GC  D
  
  WHERE
  
   (D.PERIOADA IN (:pPERIOADA))  AND   
   (D.FORM = 62) 
   AND D.COL1 IS NOT NULL
 --  AND REGEXP_LIKE (D.COL1, '\[\[:alpha:\]\]')
 
-- AND REGEXP_LIKE(D.COL1, '\[\[:digit:\]\]')
 
 --AND REGEXP_LIKE(TO_CHAR(D.COL1), '\[^0-9\]+')
 
 
   GROUP BY 
    D.UNIT_CODE,
         D.CUATM,
         D.CAPITOL,
          D.RIND ,
          D.COL1  
         
         
        ORDER BY 
        D.COL1
于 2021-02-02T14:51:06.373 に答える