在MySQL中更新分隔字符串值

在MySQL中更新分隔字符串值,mysql,Mysql,假设我有一个列值'1 | 2 | 3 | 4 | 5'。这些值是数组的字符串表示形式,我想删除字符串中的单个值(按整数),从而得到'1 | 2 | 4 | 5'。考虑到要删除的整数可能位于字符串中的任何位置,MySQL中最有效的方法是什么 update table set col=replace ( col, '3','') 这将在列上执行区分大小写的搜索。如果它是一个巨大的表,那么在此列上有一个索引。结果将相当快 这将在列上执行区分大小写的搜索。如果它是一个巨大的表,那么在此列上有一个索引。

假设我有一个列值
'1 | 2 | 3 | 4 | 5'
。这些值是数组的字符串表示形式,我想删除字符串中的单个值(按整数),从而得到
'1 | 2 | 4 | 5'
。考虑到要删除的整数可能位于字符串中的任何位置,MySQL中最有效的方法是什么

update table set col=replace ( col, '3','')
这将在列上执行区分大小写的搜索。如果它是一个巨大的表,那么在此列上有一个索引。结果将相当快


这将在列上执行区分大小写的搜索。如果它是一个巨大的表,那么在此列上有一个索引。结果将相当快。

您可以使用以下内容:

UPDATE yourtable
SET col = TRIM(BOTH '|' FROM REPLACE(
            REPLACE(
              CONCAT('|',REPLACE(col, '|', '||'), '|'),
              '|3|', '')
            , '||', '|')
          )
在这里,我将每个
|
加倍到
|
,然后在开头添加一个
|
,在结尾添加一个。这样,每个元素的开头都有自己的
,结尾都有自己的

现在我们可以安全地用空字符串替换
|3 |

我们现在需要将double
|
转换回
|
,并修剪字符串以最终删除开头的
|
,以及结尾的一个

看到它工作


如果您确定元素3不能出现多次,则可以跳过将
|
加倍到
|
,并且必须将
|3
替换为
。其余的都一样。

您可以使用如下内容:

UPDATE yourtable
SET col = TRIM(BOTH '|' FROM REPLACE(
            REPLACE(
              CONCAT('|',REPLACE(col, '|', '||'), '|'),
              '|3|', '')
            , '||', '|')
          )
在这里,我将每个
|
加倍到
|
,然后在开头添加一个
|
,在结尾添加一个。这样,每个元素的开头都有自己的
,结尾都有自己的

现在我们可以安全地用空字符串替换
|3 |

我们现在需要将double
|
转换回
|
,并修剪字符串以最终删除开头的
|
,以及结尾的一个

看到它工作


如果您确定元素3不能出现多次,则可以跳过将
|
加倍到
|
,并且必须将
|3
替换为
。其余的都是一样的。

最有效的方法是规范化数据库。最有效的方法是规范化数据库。如果其中有
33
的值怎么办?这将导致一个双分隔符--“1 | 2 | 4 | 5”。我正在寻找一种方法来“拆分”该值,从结果“数组”中删除一个,然后将结果与分隔符“连接”起来。如果其中有一个值
33
,会怎么样?这将导致一个双分隔符-“1 | 2 | 4 | 5”。我正在寻找一种方法来“拆分”值,从结果“数组”中删除一个值,并使用分隔符将结果“连接”回来。对于创造性,使用+1。然而,我怀疑一定有一种更干净的方法来处理REGEX?????。@DeweyOx谢谢:)REGEX替换会更干净,但是mysql本机只支持regexp函数的一个子集,您必须安装此udf才能获得完整的REGEX支持:谢谢@fthiella。我会一直使用它,直到我奇迹般地找到一个更干净的替代品。创造力+1。然而,我怀疑一定有一种更干净的方法来处理REGEX?????。@DeweyOx谢谢:)REGEX替换会更干净,但是mysql本机只支持regexp函数的一个子集,您必须安装此udf才能获得完整的REGEX支持:谢谢@fthiella。我会一直用这个直到我奇迹般地找到一个更干净的替代品。