Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql REGEXP\u REPLACE可替换列表中除特定域以外的电子邮件_Sql_Oracle_Plsql_Regexp Replace - Fatal编程技术网

Sql REGEXP\u REPLACE可替换列表中除特定域以外的电子邮件

Sql REGEXP\u REPLACE可替换列表中除特定域以外的电子邮件,sql,oracle,plsql,regexp-replace,Sql,Oracle,Plsql,Regexp Replace,我是正则表达式的新手。我正在尝试从列表中删除不属于特定域的电子邮件 例如,我有以下电子邮件列表: John@yahoo.co.in , Jacob@gmail.com, Bob@rediff.com, Lisa@abc.com, sam@gmail.com , rita@yahoo.com 我只需要获得gmail ID: Jacob@gmail.com, sam@gmail.com 请注意,逗号分隔符前可能有空格。 谢谢你的帮助 这可能是你的一个开始 SELECT * FROM (

我是正则表达式的新手。我正在尝试从列表中删除不属于特定域的电子邮件

例如,我有以下电子邮件列表:

John@yahoo.co.in , Jacob@gmail.com, Bob@rediff.com,
Lisa@abc.com, sam@gmail.com , rita@yahoo.com
我只需要获得gmail ID:

Jacob@gmail.com, sam@gmail.com
请注意,逗号分隔符前可能有空格。
谢谢你的帮助

这可能是你的一个开始

SELECT *
  FROM (    SELECT REGEXP_SUBSTR (str,
                                  '[[:alnum:]\.\+]+@gmail.com',
                                  1,
                                  LEVEL)
                      AS SUBSTR
              FROM (SELECT ' John@yahoo.co.in , Jacob.foo@gmail.com,   Bob@rediff.com,Lisa@abc.com, sam@gmail.com , sam.bar+stackoverflow@gmail.com, rita@yahoo.com, foobar '
                              AS str
                      FROM DUAL)
        CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE (str, '[^,]+')) + 1)
 WHERE SUBSTR IS NOT NULL ;
再举几个例子,但是电子邮件检查器应该遵守相应的RFC,查看维基百科以了解更多关于它们的信息


灵感来自

这里有一种使用CTE的方法,只是为了对问题有不同的理解。第一步是创建一个包含已解析列表元素的CTE表。然后从中选择。CTE正则表达式处理空列表元素

with main_tbl(email) as (
  select ' John@yahoo.co.in , Jacob.foo@gmail.com,   Bob@rediff.com,Lisa@abc.com, sam@gmail.com , sam.bar+stackoverflow@gmail.com, rita@yahoo.com, foobar '
  from dual
),
email_list(email_addr) as (
  select trim(regexp_substr(email, '(.*?)(,|$)', 1, level, NULL, 1))
  from main_tbl
  connect by level <= regexp_count(email, ',')+1
)
-- select * from email_list;
select LISTAGG(TRIM(email_addr), ', ') WITHIN GROUP ( ORDER BY email_addr )  
from email_list
where lower(email_addr) like '%gmail.com';

在您的示例gmail.com中,您可以尝试只获取与特定域匹配的电子邮件,而不是抑制与特定域不匹配的电子邮件:

WITH a1 AS (
    SELECT 'John@yahoo.co.in , Jacob@gmail.com, Bob@rediff.com,Lisa@abc.com, sam@gmail.com , rita@yahoo.com' AS email_list FROM dual
)
SELECT LISTAGG(TRIM(email), ',') WITHIN GROUP ( ORDER BY priority )
  FROM (
    SELECT REGEXP_SUBSTR(email_list, '[^,]+@gmail.com', 1, LEVEL, 'i') AS email
         , LEVEL AS priority
      FROM a1
   CONNECT BY LEVEL <= REGEXP_COUNT(email_list, '[^,]+@gmail.com', 1, 'i')
);

也就是说,Oracle可能不是最好的工具。您是否将这些电子邮件地址作为列表存储在某个表中?如果是这样的话,@GordonLinoff的评论很贴切——如果可以的话,请修复您的数据模型。

使用%gmail.com作为“从表名中选择*”,其中的电子邮件%gmail.com可以修复您的数据模型。不要以字符串形式存储列表。这不是SQLish存储列表的方式。请使用REPLACE_REGEXP函数定义与要筛选出的域匹配的表达式,并将其替换为空字符串