2010-03-26 84 views
2

我需要比较列(LASTNAME)与系统变量(:VARIABLE)的值,但该变量是一个电子邮件地址,所以我需要删除“@ email.com”和“firstname”。我试过的一些东西:如何使用Oracle从[email protected]提取姓氏?

select * 
    from TABLENAME 
where LASTNAME LIKE :VARIABLE 

select * 
    from TABLENAME 
where LASTNAME IN :VARIABLE 

我已经能够修剪@ email.com,无法弄清楚如何修剪FIRSTNAME。与此同时。

+0

任何机会,你可以从应用程序消耗的查询,而不是在SQL这样做呢? – Juliet 2010-03-27 01:14:32

回答

3

正则表达式可以帮助:

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

LAST_NAME 
--------- 
lastname 

然后将查询可能看起来像:

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

正则表达式支持是Oracle 10g +,对不对? – 2010-03-27 01:10:18

+0

是10g + for regexp。并且一定要让你的DBA签署它,因为新特性往往是Oracle漏洞出现的地方,至少这是我们的DBA总是想到当我们想尝试新的东西和幻想时。 – 2010-03-27 02:44:40

+2

10克几乎不是“新”。 – DCookie 2010-03-27 05:35:31

0

您可以使用SUBSTR和INSTR的组合。

instr函数返回字符串中子字符串的位置。用这个你可以找到“。”或者“@”字符。

然后用SUBSTR中从一开始得到的字符串到先前位于位置

SELECT SUBSTR(“取前四个字符”,1,4)

1

用途:

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

添加UPPERLOWER双方如果你需要确保不区分大小写匹配。

参考:

相关问题