Mysql 使用特定的逗号分隔值更新列

Mysql 使用特定的逗号分隔值更新列,mysql,sql,Mysql,Sql,我创建了一个以逗号分隔形式存储值的表。 是否有任何机制可以实现以下结果 我在表中有一个名为qty的列,它以以下格式存储值: Initially Column Contain:- 1,5,8,9,7,10,5 现在我想更新第三个值,即8乘以2 So Final Answer that Column contain is:- 1,5,2,9,7,10,5 假设在学生表中有一列SampleID: 表中Name的值为:“1,5,8,9,7,10,5”,您希望将“8”替换为“2” 您可以使用以下查

我创建了一个以逗号分隔形式存储值的表。 是否有任何机制可以实现以下结果

我在表中有一个名为qty的列,它以以下格式存储值:

Initially Column Contain:-  1,5,8,9,7,10,5
现在我想更新第三个值,即8乘以2

So Final Answer that Column contain is:-  1,5,2,9,7,10,5

假设在学生表中有一列SampleID

表中Name的值为:“1,5,8,9,7,10,5”,您希望将“8”替换为“2”

您可以使用以下查询:

UPDATE dbo.Student
SET [SampleID] = REPLACE([SampleID], '8', '2')

您可以进一步修改此选项以获得更高的准确性。

让我们假设Student表中有列SampleID

表中Name的值为:“1,5,8,9,7,10,5”,您希望将“8”替换为“2”

您可以使用以下查询:

UPDATE dbo.Student
SET [SampleID] = REPLACE([SampleID], '8', '2')

您可以进一步修改此选项以获得更高的准确性。

实际上,您不应该使用逗号存储值,因为这将导致SQL注入攻击,而不会导致后面的攻击。但现在要处理以下查询:

     update table_name set coulmn_name=REPLACE('1,5,8,9,7,10,5', '8', '2') where 1
 and conditions;

实际上,您不应该使用逗号存储值,因为这将导致SQL注入攻击,并且不会导致后面的任何攻击。但现在要处理以下查询:

     update table_name set coulmn_name=REPLACE('1,5,8,9,7,10,5', '8', '2') where 1
 and conditions;

使用多个字符串函数可以做到这一点:

update yourtabel
set yourcol = 
    concat(
        substring_index(yourcol, ',', 2), -- this will get string without trailing comma before third value
        ',',
        '2', -- the value you want to update to third value
        ',',
        substring_index(
            yourcol,
            ',',
            2 - (length(yourcol) - length(replace(yourcol, ',', '')))
        ) -- this will get string without heading comma after third value
     )
这里是一个演示

子字符串索引
长度

替换

使用几个字符串函数可以做到:

update yourtabel
set yourcol = 
    concat(
        substring_index(yourcol, ',', 2), -- this will get string without trailing comma before third value
        ',',
        '2', -- the value you want to update to third value
        ',',
        substring_index(
            yourcol,
            ',',
            2 - (length(yourcol) - length(replace(yourcol, ',', '')))
        ) -- this will get string without heading comma after third value
     )
这里是一个演示

子字符串索引
长度

replace

您可以使用字符串替换,因为您知道这不是一个格式良好的规范化数据库

您的数据库应遵循标准规范化模式,以便在性能、可用性和维护更好的表之间获得可靠的关系。你的桌子还不到1NF

虽然现在的查询有帮助,但是考虑更改结构。

   update TBL 
       set column = replace(column , '8', '2') 
     where your_condition

查看此链接以了解有关规范化及其形式的更多信息:

您可以使用字符串替换,因为您知道这不是一个格式良好的规范化数据库

您的数据库应遵循标准规范化模式,以便在性能、可用性和维护更好的表之间获得可靠的关系。你的桌子还不到1NF

虽然现在的查询有帮助,但是考虑更改结构。

   update TBL 
       set column = replace(column , '8', '2') 
     where your_condition

查看此链接以了解有关规范化及其形式的更多信息:

这就是为什么我们不将表示值列表的逗号分隔字符串作为列值的原因。PS当你在谷歌上搜索各种关于你问题的清晰陈述时,你发现了什么?例如你的头衔加标签?(尽管你的标题应该更清楚。)这是一个通过谷歌搜索回答的常见问题。回答者都应该将其标记为重复。编写一个过程来解析字符串并传递位置和替换值的参数。但你不应该以这种方式存储数据。我不同意将此标记为重复。上述两个答案都不能回答所提出的问题。有人认为这是一种糟糕的数据存储方式,但这并不是答案。这就是为什么我们不将表示值列表的逗号分隔字符串作为列值的原因。PS当你在谷歌上搜索各种关于你问题的清晰陈述时,你发现了什么?例如你的头衔加标签?(尽管你的标题应该更清楚。)这是一个通过谷歌搜索回答的常见问题。回答者都应该将其标记为重复。编写一个过程来解析字符串并传递位置和替换值的参数。但你不应该以这种方式存储数据。我不同意将此标记为重复。上述两个答案都不能回答所提出的问题。有人认为这是一种不好的数据存储方式,这并不是一个答案。关于规范化的好观点,向上投票。在以下情况下它将失败:更新wp_posts set test_csv='1,2,9,10101,1112112488956',其中ID=116;然后更新wp_posts set test_csv=replace(test_csv,'10','101'),其中ID=116;关于规范化的观点很好,在下面的情况下它将失败:更新wp_posts set test_csv='1,2,9,10101,1112112488956',其中ID=116;然后更新wp_posts set test_csv=replace(test_csv,'10','101'),其中ID=116;