2017-10-11 2 views
0

Je me demandais simplement comment vous rechercheriez un mélange de cas. Par exemple, je veux trouver tous les employés avec le nom de famille 'davies', mais je veux être capable de trouver n'importe quel mélange de cas tels que 'DavIes' ou 'DAVies'. C'est ce que j'ai essayé.Filtre SQL pour boîtier mixte

SELECT LAST_NAME 

FROM EMPLOYEES 

WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID 

FROM EMPLOYEES 

WHERE LAST_NAME = '[Dd][Aa][Vv][Ii][Ee][Ss]'); 
+0

j'écrire un indice de fonction qui UPPER ou Abaisse le nom. De cette façon, la base de données peut utiliser l'index basé sur la fonction pour rechercher au lieu de simplement le nom de famille. [Docs] (https://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_indexes.htm#ADFNS257) – xQbert

+1

Copie possible de [recherche insensible à la casse dans Oracle] (https://stackoverflow.com/ questions/5391069/case-insensitive-searching-in-oracle) – xQbert

Répondre

1

J'utiliser la fonction UPPER ou LOWER et IN

SELECT LAST_NAME 
FROM EMPLOYEES 
WHERE DEPARTMENT_ID IN (
    SELECT DEPARTMENT_ID 
    FROM EMPLOYEES 
    WHERE UPPER(LAST_NAME) = 'DAVIES' 
); 

Malheureusement, il invalident l'utilisation d'index.

+0

Pourquoi avez-vous besoin de IN? vous cherchez le nom de famille de Employés – maSTAShuFu

+0

@maSTAShuFu oui, c'est bizarre. Je n'ai pas remarqué qu'il interroge la même table dans la sous-requête. J'ai supposé à tort que ça devait être une table différente. –

+0

Commuté IN à = et ça marche, merci. – Glaz

1

En utilisant UPPER

SELECT * 
    FROM EMPLOYEES 
    WHERE UPPER(LAST_NAME) = 'DAVIES'