SQL查找并替换为通配符

时间:2014-03-10 06:46:58

标签: mysql sql replace

起始位置:我有一个SQL-DB,它包含几个带有hunderts或tousends条目的表。现在在几个字段(列)中有URL,应该缩短(到原始URL的摘录)并添加新参数。问题是,有一些«发现&替换»做:

  1. 查找所有表格的所有字段/列中的所有(旧)URL(独立或中间文本)...

    http://www.domain.com/click?p(abcdef)a(123456)url(http://www.url.com)

  2. ...并使用(新)网址替换旧网址:

    http://www.url.com/?at=uvwxyz

  3. ...正如您所看到的,我需要在url-parameter中使用通配符...就像http://www.domain.com/click?p(abcdef)a(123456)url(*)一样,因为旧网址以)结尾,我只需要旧网址的摘录(第二个网址) )加上一个新的url-parameter。

    • 旧网址中的(和)内的网址可能会有所不同......可能存在数字或数千个不同的网址。
    • 这些网址位于多个表格的多个字段中......内部并且大部分都是由文字包围的,不一定是独立的(见下表)。
    • 每个条目可能有多个字段/列, none,每个字段/列应该更改一个或多个网址。

    表示例:

    +----------+---+-------------------+---------------+---+--------------+--------------+
    | entry_id | … | field_id_1        | field_ft_1    | … | field_id_199 | field_ft_199 |
    +----------+---+-------------------+---------------+---+--------------+--------------+
    | 21364    | … | blabla URL blabla | NULL          | … | none         | none         |
    | 21363    | … | text URL text     | text URL text | … | none         | URL          |
    | …        | … | text URL text URL | NULL          | … | URL text     | none         |
    +----------+---+-------------------+---------------+---+--------------+--------------+
    

    字段/列值示例:

    The new «App of the Week» is named «<a href="http://www.domain.com/click?p(abcdef)a(123456)url(https://itunes.apple.com/ch/app/popagraph/id587595362?mt=8)">PopAGraph</a>».
    This App does this and that and bla bla bla <a href="http://www.domain.com/click?p(abcdef)a(123456)url(https://itunes.apple.com/ch/app/popagraph/id587595362?mt=8)">kostenlos</a>.
    In the iOS Store there are «Editors Choise» like: «<a href="http://www.domain.com/click?p(abcdef)a(123456)url(https://itunes.apple.com/ch/app/the-room-two/id667362389?mt=8)">The Room Two</a>» (CHF 3.00). And some more Text bla bla bla.
    

    更新:由于缺乏细节而重写了整个问题

1 个答案:

答案 0 :(得分:0)

要查找旧字符串的最后URL部分,请使用substring_indexsubstr个函数。

示例

SET @old_value := 
         'http://www.domain.com/click?p(abcdef)a(123456)url(http://www.url.com)';
select @url := substr( @u := substring_index( @old_value, '(', -1 )
               from 1 
               for ( length( @u ) - 1 ) 
       ) as url

这将返回

+--------------------+
| url                |
+--------------------+
| http://www.url.com |
+--------------------+

要使用新的url值更新记录,您必须使用concat将查询参数附加到网址。

示例

update my_table 
    set url_col = concat( @url, '/?at=uvwxyz' )
where
    url_col = @old_value
    -- and  -- add more conditions if required
    -- ... ...

请参阅

  • MySQL: SUBSTRING_INDEX( str, delim, count )
    • 在计数出现之前,从字符串str返回子字符串 分隔符delim。如果计数是正数,那么一切都在左边 返回最终分隔符(从左边开始计数)。如果算数是 否定,最终分隔符右侧的所有内容(计数 从右边)返回。 SUBSTRING_INDEX()执行一个 搜索delim时区分大小写的匹配。