Oracle-フィールドに小文字が含まれる場所を選択する
-
11-07-2019 - |
質問
Oracle 9.2.0.6データベースにusersというテーブルがあります。 2つのフィールドはvarchar-last_nameとfirst_nameです。
このテーブルに行が挿入されるとき、名と姓のフィールドはすべて大文字であると想定されていますが、これら2つのフィールドの一部の値は大文字と小文字が混在しています。
テーブルに含まれる、姓または名に小文字が含まれるすべての行を表示するクエリを実行したい。
ネットを検索し、REGEXP_LIKEを見つけましたが、それはOracleの新しいバージョンのものである必要があります-私にはうまくいかないようです。
もう1つ試したのは、「abcde ... z」を翻訳することでした。 " $$$$$ ... $"そして、私のフィールドで「$」を検索しますが、より良い方法が必要ですか?
事前に感謝します!
解決
これについてはどうですか:
select id, first, last from mytable
where first != upper(first) or last != upper(last);
他のヒント
BQのSQLとJustinの2番目のSQLは機能すると思います。このシナリオでは:
first_name last_name
---------- ---------
bob johnson
Bob Johnson
BOB JOHNSON
クエリで最初の2行を返すようにします。
ただし、これが効率的なクエリであることを確認したいだけです-私のテーブルには5億行あります。
upper(first_name)!= first_nameと言うと、" first_name"はオラクルが見ている現在の行に常に関係していますか?私はこのテーブルを自分自身に結合することを恐れていたため、最初はこのメソッドを使用することを恐れていましたが、彼らはあなたがSQLを書いたように、同等性チェックは行ごとにのみ動作しているようです私のために働くだろう。
Oracle 10g以降を探している場合は、次の例を使用できます。列の文字のいずれかが小文字である行を見つける必要があることを考慮してください。
Column1
.......
MISS
miss
MiSS
上記の例で、値 miss
および MiSS
を見つける必要がある場合、以下のクエリを使用できます
SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[a-z]');
SELECT *
FROM mytable
WHERE FIRST_NAME IN (SELECT FIRST_NAME
FROM MY_TABLE
MINUS
SELECT UPPER(FIRST_NAME)
FROM MY_TABLE )
これを試してください:
SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[a-z]','c'); => Miss, miss lower text
SELECT * FROM YOU_TABLE WHERE REGEXP_LIKE(COLUMN1,'[A-Z]','c'); => Miss, MISS upper text
DB照合設定が大文字と小文字を区別しないSQLサーバーの場合は、次を使用します。
SELECT * FROM tbl_user WHERE LEFT(username,1) COLLATE Latin1_General_CS_AI <> UPPER(LEFT(username,1))