SQL - 使用正则表达式更新Colum中的字符串

时间:2017-03-28 11:32:26

标签: sql oracle

使用SQL,我试图用regexp更新列中的子字符串。

这是我的目标:

  • 我的专栏中有HTML内容: 例如:

    <a href="http://blabla.fr/blibli">Link1</a>
    

或包含多个链接的其他内容:

  <p>BlaBlaBla</p>
  <a href="http://blabla.fr/blibli">Link1</a>
  <a href="http://blabla.fr/">Link2</a>
  <a href="http://blabla.fr/test">Link3 </a>

(此示例表示整个字符串,选择结果不多)   - 我想删除不包含'blibli'的网址中的'http://'

所以我做了这个查询

 UPDATE my_table SET my_col = replace(my_col,'http://','') where not regexp_like(my_col,'http://^((?blibli).)*$')

但是只有当列包含至少一个像我的第一个例子的链接时才能工作。 如果列包含许多链接,则由于条件,它将不会更新任何内容。 (也许这么做很多步?) 我试着看看REGEXP_SUBSTR,但我想我也无法实现这一点。 第二个例子的期望结果是:

<p>BlaBlaBla</p>
<a href="http://blabla.fr/blibli">Link1</a>
<a href="blabla.fr/">Link2</a>
<a href="blabla.fr/test">Link3 </a>

感谢你给我的任何建议

3 个答案:

答案 0 :(得分:1)

您可以使用REGEXP_REPLACE进行分组

UPDATE my_table SET my_col= REGEXP_REPLACE(my_col, 'href="(http://.*blibli[^"]*)|href="http://([^"])', 'href="\1')

您可以通过此链接http://rextester.com/HEMG60862

查看示例

答案 1 :(得分:1)

与Trung的方法类似,但捕获两个(或者)匹配的组:

update my_table set my_col = regexp_replace(my_col,
  'href="(http://[^"]*blibli[^"]*)"|href="http://([^"]*)"', 'href="\1\2"')

可选地使用where子句来避免更新没有href的行,比方说。

如何翻译样本值(在CTE中提供)的快速演示:

with my_table (id, my_col) as (
  select 1, '<a href="http://blabla.fr/blibli">Link1</a>' from dual
  union all select 2, '<a href="http://blabla.fr/blibli/abc">Link1</a>' from dual
  union all select 3, '<a href="http://blabla.fr/xbliblix">Link1</a>' from dual
  union all select 4, '<a href="http://blabla.fr/test">Link1</a>' from dual
  union all select 5, '<p>BlaBlaBla</p>
<a href="http://blabla.fr/blibli">Link1</a>
<a href="http://blabla.fr/">Link2</a>
<a href="http://blabla.fr/test">Link3 </a>' from dual
)
select id, my_col, regexp_replace(my_col,
    'href="(http://[^"]*blibli[^"]*)"|href="http://([^"]*)"',
    'href="\1\2"') as result
from my_table;

        ID MY_COL                                           RESULT                                          
---------- ------------------------------------------------ ------------------------------------------------
         1 <a href="http://blabla.fr/blibli">Link1</a>      <a href="http://blabla.fr/blibli">Link1</a>     
         2 <a href="http://blabla.fr/blibli/abc">Link1</a>  <a href="http://blabla.fr/blibli/abc">Link1</a> 
         3 <a href="http://blabla.fr/xbliblix">Link1</a>    <a href="http://blabla.fr/xbliblix">Link1</a>   
         4 <a href="http://blabla.fr/test">Link1</a>        <a href="blabla.fr/test">Link1</a>              
         5 <p>BlaBlaBla</p>                                 <p>BlaBlaBla</p>                                
           <a href="http://blabla.fr/blibli">Link1</a>      <a href="http://blabla.fr/blibli">Link1</a>     
           <a href="http://blabla.fr/">Link2</a>            <a href="blabla.fr/">Link2</a>                  
           <a href="http://blabla.fr/test">Link3 </a>       <a href="blabla.fr/test">Link3 </a>             

答案 2 :(得分:0)

你说“我想删除不包含'blibli'的网址中的'http://'”

为什么不使用这样的简单正则表达式?

{{1}}