【问题标题】:SQL - Update String in Colum with regexSQL - 使用正则表达式更新列中的字符串
【发布时间】:2017-03-29 01:33:23
【问题描述】:

使用 SQL,我正在尝试使用正则表达式更新列中的子字符串。

这是我的目标:

  • 我的专栏中有 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>

(这个例子代表了一个完整的字符串,select的结果不多) - 我想删除不包含 'blibli' 的 url 中的 '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>

感谢您给我的任何建议

【问题讨论】:

  • 为了清楚起见,您的第二个示例是列值 - 即单个字符串 - 不是表中四行的值? blibli 是否总是 URL 的最后一部分,或者它可以在中间,或者至少总是路径中的一个级别(即它总是 .../blibli".../blibli/...)?
  • 是的对不起,第二个例子中的所有值都包含在一个字符串中,“blibli”可以是任何地方。我编辑了我的帖子;)。感谢这一点

标签: sql oracle


【解决方案1】:

您可以使用 REGEXP_REPLACE 进行分组

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

您可以通过此链接查看示例http://rextester.com/HEMG60862

【讨论】:

  • 感谢您的提示。这行得通 ;-)。 @Alex Poole 提到了一个关于匹配两个组的好点。 Regex_replace 是个好方法
【解决方案2】:

类似于 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>             

【讨论】:

  • 感谢所有这些解释 ;-) 以及关于匹配两个组的好点 ;-)
【解决方案3】:

您说“我想删除 url 中不包含 'blibli' 的 'http://'”

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

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

【讨论】:

  • 看起来第二个示例是一个包含三个 URL 的单个字符串列值,并且应该只触及其中两个。虽然不完全清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 2021-09-19
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多