23

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

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

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

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

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

前もって感謝します!

4

6 に答える 6

76

これはどう:

select id, first, last from mytable
where first != upper(first) or last != upper(last);
于 2008-11-25T14:53:00.437 に答える
2

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 を書いた方法では、等価チェックは行単位でのみ動作しているように見えます。私のために働くだろう。

于 2008-11-25T15:12:44.063 に答える
0
 SELECT * 
 FROM mytable 
 WHERE FIRST_NAME IN (SELECT FIRST_NAME 
                      FROM MY_TABLE
                      MINUS 
                      SELECT UPPER(FIRST_NAME) 
                      FROM MY_TABLE )
于 2012-07-31T13:29:14.147 に答える
-1

DB 照合設定が大文字と小文字を区別しない SQL サーバーの場合、次を使用します。

SELECT * FROM tbl_user WHERE LEFT(username,1) COLLATE Latin1_General_CS_AI <> UPPER(LEFT(username,1))
于 2014-12-01T11:02:38.267 に答える