如何替换包含特定文本的mySQL列?

时间:2018-12-19 17:36:17

标签: mysql sql substring

我有一个表格“ behavior”和一个“ url”列。 “ URL”列包含一些行,如下所示。

我想要做的是更改列“ url”的行,例如

/this-is/the-main-url?fbclid=IwAR1VIvXLBSIs4S_eRc4FGVYhIsiViWPEBBSmpkHMatjAcH0Rh-_u4VGoo

/this-is/the-main-url

同样如此

/here-is/another-url?utm_source=facebook&utm_medium=cpc&utm_campaign=fb.traffic

/here-is/another-url
行为表的

因此,如果字符串包含?fbclid?utm_source保留所有内容。

这也可以通过使用多个查询而不是一个复杂的查询来完成。

注意: utm_source或fbclid,参数和ID可以多种多样,所以我需要一个动态的解决方案。

谢谢

2 个答案:

答案 0 :(得分:1)

MySQL SUBSTRING_INDEX功能很方便。

https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_substring-index

示范

SELECT SUBSTRING_INDEX(
         SUBSTRING_INDEX(
           t.foo 
           ,'?fbclid'
           ,1
         )
         ,'?utm_source'
         ,1
       )
  FROM ( SELECT '/this-is/the-main-url?fbclid=IwAR1VIvXLBSIs4S_eRc4FGVYhIsiViWPEBBSmpkHMatjAcH0Rh-_u4VGoo' AS foo 
         UNION ALL SELECT '/here-is/another-url?utm_source=facebook&utm_medium=cpc&utm_campaign=fb.traffic'
       ) t

一旦表达式可以使用并经过测试,我们就可以在UPDATE语句中使用这些表达式。但是我们要首先在SELECT语句中测试表达式。

 UPDATE mytable 
    SET mycol = SUBSTRING_INDEX( mycol ,'?fbclid',1) 

关注

原始问题中的规范是从字符串中删除字符串'?fbclid'?utm_source

问题现在更新为“参数和ID可以是多种多样的,所以我需要一个动态的解决方案。”

如果我们只想在第一个问号字符之后(包括第一个字符)砍掉所有内容,那么我们可以这样做:

  SUBSTRING_INDEX( myurl ,'?',1)

如果我们想保留一些问号字符,并且只修剪某些字符串,那么我们可以多次调用SUBSTRING_INDEX

只要使其更具动态性,我们就可以为每个定界符调用SUBSTRING_INDEX,并将定界符参数(第二个参数)作为参数传递给SUBSTRING_INDEX

答案 1 :(得分:0)

这确实可以工作:

select substring(colname,1,instr(colname,'?')-1) from tablename;

将列整体更改:

update tablename set colname=
select substring(colname,1,instr(colname,'?')-1) from tablename;