SQL 批量字符串操作

标签 sql database oracle

我正在使用 Oracle 数据库,需要在其中操作一个字符串列。该列包含以下格式的多个电子邮件地址:

jgooooll@gmail.com;dhookep@gmail.com;amoore@outlook.com

我想做的是删除所有结尾有“@gmail.com”的内容(在此示例中,amoore@outlook.com 将被删除)但是 amoore@outlook。 com 可能是该列下一行中的第一封电子邮件,因此这种方式没有真正固定的格式,唯一的格式是每个地址由分号分隔。

是否可以通过一个命令来执行此操作以遍历列中的每一行并删除所有不是@gmail.com 的内容?我不太确定这种处理在 SQL 中是否可行。只是在寻找你的想法!!

非常感谢你们。期待您的来信!

最佳答案

仅适用于 Oracle 11g (11.2) 以上版本。因为 listagg 函数只在 11.2 以后才支持。如果您使用的是 10.1 至 11.1,您可以编写自己的字符串聚合函数或采用 this一。

with T1 as (
  select 1 id, 'jhd@jk.com;jgooooll@gmail.com;dhookep@gmail.com;amoore@outlook.com' emails from dual union all
  select 2 id, 'jhd@jk.com;jgooooll@gmail.com;dhookep@gmail.com;amoore@outlook.com' emails from dual 
) 

select id
     , listagg(email, ';') within group(order by id) emails
  from (select id 
             , regexp_substr(emails,'[^;]+', 1, rn) email 
          from t1 
         cross join (select rownum rn
                       from(select max (regexp_count(emails, '[^;]+')) ml
                              from t1
                            )
                           connect by level <= ml      
                      )
         )                             
where email like '%@gmail.com%'
group by id

Id               Emails 
--------------------------------------
1     dhookep@gmail.com;jgooooll@gmail.com 
2     dhookep@gmail.com;jgooooll@gmail.com 

这是一个Demo

关于SQL 批量字符串操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12392111/

相关文章:

Oracle 查询包含 "&"特殊字符

python - 如何使用 python 循环遍历文件并使用文本文件中的参数执行查询

database - 寻找D2009+的本地数据库

java - 使用hibernate将 map 插入数据库

数据库索引不适用于具有冒号 (":"值的列)

sql - 与 Oracle 的 CONNECT BY ... START WITH 等效的 PostgreSQL 语法是什么?

php - Mysql查询,选择join两个表

sql - 我很困惑为什么我的查询没有返回正确的项目

mysql - sql select 查询不返回某些列

database - 为 Laravel 映射现有数据库表