Question

J'ai une table, des utilisateurs, dans une base de données Oracle 9.2.0.6. Deux des champs sont varchar - last_name et first_name.

Lorsque des lignes sont insérées dans cette table, les champs prénom et nom sont censés être en majuscules, mais certaines valeurs de ces deux champs sont mélangées.

Je souhaite exécuter une requête qui affiche toutes les lignes de la table comportant des prénoms ou des noms avec des caractères minuscules.

J'ai cherché sur le net et trouvé REGEXP_LIKE, mais ce doit être pour les nouvelles versions d'Oracle - cela ne semble pas fonctionner pour moi.

J'ai aussi essayé de traduire "abcde ... z". to "$$$$$ ... $" et ensuite rechercher un '$' dans mon domaine, mais il doit y avoir un meilleur moyen?

Merci d'avance!

Était-ce utile?

La solution

Que diriez-vous de cela:

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

Autres conseils

Je pense que le SQL de BQ et le second SQL de Justin fonctionneront, car dans ce scénario:

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

Je souhaite que ma requête renvoie les 2 premières lignes.

Je veux simplement m'assurer que cette requête sera efficace - ma table contient 500 millions de lignes.

Lorsque vous dites upper (first_name)! = first_name, est " first_name " toujours se rapportant à la ligne en cours que Oracle regarde? J'avais peur d'utiliser cette méthode au début parce que j'avais peur de finir par joindre cette table à elle-même, mais comme vous écrivez tous les deux le code SQL, il semble que le contrôle d'égalité ne fonctionne que ligne par ligne, ce qui travaillerait pour moi.

Si vous recherchez Oracle 10g ou une version ultérieure, vous pouvez utiliser l'exemple ci-dessous. Considérez que vous devez trouver les lignes où l'une des lettres d'une colonne est en minuscule.

Column1
.......
MISS
miss
MiSS

Dans l'exemple ci-dessus, si vous devez rechercher les valeurs miss et MiSS , vous pouvez utiliser la requête ci-dessous

.
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 )

Essayez ceci:

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

pour le serveur SQL où le paramètre de classement de base de données est sensible à la casse, utilisez les éléments suivants:

SELECT * FROM tbl_user WHERE LEFT(username,1) COLLATE Latin1_General_CS_AI <> UPPER(LEFT(username,1))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top