Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在替换逗号分隔列表中的特定值时避免重复?_Sql_Sql Server_Ssms_Sql Server 2014 - Fatal编程技术网

Sql 如何在替换逗号分隔列表中的特定值时避免重复?

Sql 如何在替换逗号分隔列表中的特定值时避免重复?,sql,sql-server,ssms,sql-server-2014,Sql,Sql Server,Ssms,Sql Server 2014,我编写了一个查询,将逗号分隔列表中的某个值更新为其他值。我知道使用逗号分隔的列表是一种非常糟糕的数据库设计,但在这种情况下,我没有任何其他选择 因此,问题是 SELECT * FROM AppUser WHERE AppValue LIKE '%429%' AND AppCode = 'BI' AND AppName = 'Categories' UPDATE AppUser SET AppValue = REPLACE(AppValue, '429', '506') 现在,上面的查询确实

我编写了一个查询,将逗号分隔列表中的某个值更新为其他值。我知道使用逗号分隔的列表是一种非常糟糕的数据库设计,但在这种情况下,我没有任何其他选择

因此,问题是

SELECT * FROM AppUser 
WHERE AppValue LIKE '%429%' AND AppCode = 'BI' AND AppName = 'Categories' 
UPDATE AppUser
SET AppValue = REPLACE(AppValue, '429', '506')
现在,上面的查询确实将
429
替换为
506
,但是如果已经有
506
呢。如果我这样查询它,它将导致重复,我将有两个
506
40550655506
而不是
405506565

那么,你能告诉我如何避免重复吗?

你的方法还有另一个问题<代码>替换('123456789','45','anything')将在您不想替换时替换

您还标记了这个SSMS(SQL Server)和MySQL,所以我猜SQL Server

UPDATE
  test
SET
  appValue = TRIM(',' FROM REPLACE(source.value, ',406,', replacement.value))
FROM
  test
CROSS APPLY
(
  SELECT ',' + appValue + ','
)
  source(value)
CROSS APPLY
(
  SELECT CASE WHEN source.value LIKE '%,506,%' THEN ',' ELSE ',506,' END
)
  replacement(value)
WHERE
  source.value LIKE '%,406,%'

或者,一个更普遍的版本

UPDATE
  test
SET
  appValue = TRIM(',' FROM REPLACE(inputs.expression, inputs.pattern, replacement.value))
FROM
  test
CROSS APPLY
(
  SELECT
    ',' + appValue + ','   AS expression,
    ',' + '406'    + ','   AS pattern,
    ',' + '506'    + ','   AS replacement
)
  inputs
CROSS APPLY
(
  SELECT
    CASE WHEN inputs.expression LIKE '%' + inputs.replacement + '%'
         THEN ','
         ELSE inputs.replacement
     END
)
  replacement(value)
WHERE
  inputs.expression LIKE '%' + inputs.pattern + '%'

我将创建一个存储过程,该过程创建一个临时表以允许标准化,从逗号分隔的值填充该表,执行任何您希望的更改,然后更新保存标准化临时表中逗号分隔值的字段。

不要使用
类似的
来匹配数字。它也将匹配
1429
4293
。使用
FIND_IN_SET()
。逗号分隔的列表是有害的。重组你的数据库,你就不会有那么多的查询问题。@danblack你读过他说他别无选择的地方吗?@MatBailie他知道这是一个糟糕的设计,读这个问题。
SSMS
SQL Server Management Studio
,通常不与
MySQL
一起使用。这是
SQL Server
还是
MySQL
?我正在使用SQL Server 2014。您知道如何在sql server 2014环境中使用此查询吗?您的查询仅在Sql server 2017中有效。如果你能帮我,我将不胜感激。非常感谢。