2010-03-26 6 views
2

J'ai besoin de comparer la valeur d'une colonne (LASTNAME) avec une variable système (: VARIABLE), mais la variable est une adresse e-mail, donc je dois couper le "@ email.com" et "prénom". Certaines choses que j'ai essayé:Comment extraire le nom de famille de pré[email protected] en utilisant Oracle?

select * 
    from TABLENAME 
where LASTNAME LIKE :VARIABLE 

select * 
    from TABLENAME 
where LASTNAME IN :VARIABLE 

J'ai été en mesure de couper le @ email.com, ne peut pas comprendre comment couper PRENOM. en même temps.

+0

Toute chance que vous pouvez le faire à partir de l'application de consommer la requête plutôt que dans le SQL? – Juliet

Répondre

3

Les expressions régulières peuvent aider:

SQL> SELECT LTRIM(regexp_substr('[email protected]','\.[^@]*'),'.') last_name from dual; 

LAST_NAME 
--------- 
lastname 

Votre requête pourrait alors ressembler à:

SELECT * 
    FROM tablename 
WHERE UPPER(LTRIM(regexp_substr(:VARIABLE,'\.[^@]*'),'.')) = UPPER(lastname); 
+1

Le support de Regex est Oracle 10g +, non? –

+0

Oui 10g + pour l'expression rationnelle. Et assurez-vous d'obtenir votre DBA pour le signer, car les nouvelles fonctionnalités ont tendance à être là où les bogues d'Oracle apparaissent, du moins c'est ce que notre DBA nous rappelle toujours quand nous voulons essayer quelque chose de nouveau et de fantaisie. –

+2

10g est à peine "nouveau". – DCookie

0

Vous pouvez utiliser une combinaison de SUBSTR et INSTR.

La fonction instr renvoie l'emplacement d'une sous-chaîne dans une chaîne. Avec celui-ci vous pouvez localiser le "." Ou le "@" char.

Utilisez ensuite le substr pour obtenir la sous-chaîne du début à la position située précédente

SELECT SUBSTR ('Prenez les quatre premiers caractères', 1, 4)

1

Utilisation:

SELECT t.* 
    FROM TABLE t 
WHERE t.lastname LIKE '%' || SUBSTR(:VARIABLE, 
            INSTR(:VARIABLE, '.') +1, 
            INSTR(:VARIABLE, '@')) || '%' 

Ajouter UPPER ou LOWER des deux côtés si vous devez être sûr de respecter la casse insensible.

Référence:

Questions connexes