web-dev-qa-db-ja.com

Oracle-フィールドに小文字がある場所を選択

Oracle 9.2.0.6データベースにテーブルusersがあります。フィールドの2つはvarcharです-last_nameとfirst_name。

このテーブルに行が挿入されると、名と姓のフィールドはすべて大文字になるはずですが、これらの2つのフィールドの一部の値は大文字と小文字が混在しています。

小文字を含む姓または名を持つテーブルのすべての行を表示するクエリを実行したいと思います。

私はネットを検索し、REGEXP_LIKEを見つけましたが、それはOracleの新しいバージョンの場合に違いありません-私にはうまくいかないようです。

私が試したもう1つのことは、「abcde ... z」を「$$$$$ ... $」に翻訳して、自分のフィールドで「$」を検索することでしたが、もっと良い方法が必要ですか?

前もって感謝します!

16
BrianH

これはどう:

select id, first, last from mytable
where first != upper(first) or last != upper(last);
61
BQ.

このシナリオでは、BQのSQLとジャスティンの2番目のSQLが機能すると思います。

first_name        last_name
----------        ---------
bob               johnson
Bob               Johnson
BOB               JOHNSON

クエリで最初の2行を返す必要があります。

ただし、これが効率的なクエリになることを確認したいだけです。私のテーブルには5億行あります。

「upper(first_name)!= first_name」と言ったとき、「first_name」は常にOracleが見ている現在の行に関係していますか?最初はこの方法を使用するのが怖かったのは、このテーブルを自分自身に結合することになるのではないかと心配でしたが、両者がSQLを作成した方法では、等価性チェックは行単位でのみ動作しているようです。私のために働くでしょう。

1
BrianH

Oracle 10g以上を探している場合は、以下の例を使用できます。列内のいずれかの文字が小文字である行を見つける必要があることを考慮してください。

Column1
.......
MISS
miss
MiSS

上記の例で、値missおよびMiSSを検索する必要がある場合は、以下のクエリを使用できます

SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[a-z]');
0
Sarath Avanavu