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中有效。如果你能帮我,我将不胜感激。非常感谢。