質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

14046閲覧

OracleでVARCHAR2型のカラムを比較演算したい

lupus_dingo

総合スコア257

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2014/12/02 13:24

VARCHAR2型のカラムに半角数字や全角の日本語が入っています。
このカラムから半角数字のみのデータのみ抜き出し、大小の比較を行いたいのですが数値変換がうまくいきません。

最初は単純に、
select TO_NUMBER(COL_A)
from table_a
と実行したところ、「ORA-01722 数値が無効です。」とエラーになりました。

そこで以下のように半角数字のデータのみを抜き出してから変換したところ、
「ORA-01426 数値オーバーフローが発生しました 」とエラーになりました。
select TO_NUMBER(COL_A)
from (
select COL_A
from table_a A
where NOT(REGEXP_LIKE(A.COL_A, '[^0-9]')
)

そこで今度は、以下のようにFUNCTIONを作成し
例外が発生しない場合のみTO_NUMBERを行うようにしたのですが
「数値オーバーフローです。 」とエラーになりました。

CREATE OR REPLACE FUNCTION TEST_FUNC(SOURCE IN VARCHAR2) RETURN NUMBER AS
BEGIN
RETURN TO_NUMBER(SOURCE);
EXCEPTION
WHEN OTHERS THEN
RETURN 0;
END;

select TEST_FUNC(COL_A) from table_a
→数値オーバーフローです。

これ以外に思い当たるアイデアがないのですが何かいい方法はないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

※11g Express Editionで確認しています。

127ケタ以上の場合にORA-01426になるみたいです。
また、NUMBER型の最大有効桁数は38桁です。
数値データ型の概要(Oracleデータ型)

lang

1select to_number('123456789012345678901234567890123456789912345678901234567890123456789012345678901234567890123456789012345678901234567890123456') from dual 2 3--- 123456789012345678901234567890123456789900000000000000000000000000000000000000000000000000000000000000000000000000000000000000 4 5 6select to_number('1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567') from dual 7 8--- ORA-01426: 数値オーバーフローが発生しました

データ量が多いと厳しいですが、パフォーマンスを度外視するなら、LPAD関数で最大桁数に合わせて先頭にゼロを埋めて、ソートするのはどうでしょうか。

lang

1SELECT * FROM ( 2 SELECT LPAD(COL_A, 127, '0') AS TGT --- 列の桁数が127の場合 3 FROM TABLE_A 4 WHERE REGEXP_LIKE(COL_A, '^[0-9]+$')) 5ORDER BY TGT

あと、直接関係ありませんが、正規表現のところは

lang

1WHERE REGEXP_LIKE(A.COL_A, '^[0-9]+$') -- 半角数字が1文字以上

のほうが良いかと思います。

投稿2014/12/02 16:24

argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupus_dingo

2014/12/03 09:13

回答ありがとうございます。 確かにこのカラムの中に127桁以上のデータがあり、 127桁の桁数制限と半角数字のみの条件を加えたところうまく動きました。 助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問