2016-04-21 63 views
2

在SQL Server中使用逗号分隔值现有值更新列在SQL Server中使用逗号分隔值现有值更新列

tbl 
id name rev_code 
1 aaa rev1,rev2,rev3 
2 bbb rev2,rev3 
3 ccc rev1,rev2 
4 ddd rev3,rev2 

我想更新其中rev_code =“REV3”需要补充的结束用,REV1一样,REV2,REV3,rev5

期望输出

id name rev_code 
1 aaa rev1,rev2,rev3,rev5 
2 bbb rev2,rev3,rev5 
3 ccc rev1,rev2 
4 ddd rev3,rev2,rev5 

回答

3

最好选择是正常化数据库:
摆脱rev_code柱和转弯它放到一个新表中,并与当前表的外键约束关联。

如果这是不可能的,你可以做这样的事情:

UPDATE tbl 
SET rev_code = rev_code + ',rev5' 
WHERE ','+ rev_code + ',' LIKE '%,rev3,%' 
AND ','+ rev_code + ',' NOT LIKE '%,rev5,%' 
+0

意味着您的like语句失败。 –

+0

@PonmaniChinnaswamy - 不,他在LHS和RHS –

+0

@PonmaniChinnaswamy中添加了前导逗号,在喜欢的两边加上了前后的逗号,我确保只有正确的值才能通过。如果这是一串逗号分隔符号码,并且您会搜索“2”,但没有这个技巧,您将在包含“2”的任何成员上获得误报 - 例如'21','3245'等等。 –

1

停止在一列存储逗号分隔值违反第一范式。考虑更改数据库设计

在最坏的情况下使用此更新来获得结果

UPDATE Yourtable 
SET [rev_code] = [rev_code] + ',rev5' 
WHERE Charindex('rev3', [rev_code]) > 0 
+0

[我们保持相同的答案思考:)](http://stackoverflow.com/a/36288648/3094533) –

+0

@ZoharPeled - 是的:) –

+0

消息8152,级别16,状态13,行1字符串或二进制数据将被截断。该语句已终止。错误? – mailtoasp

0

试试这个,这将为rev_code rev5如果有rev3rev5已经不存在。

UPDATE tbl 
SET rev_code = rev_code + ',rev5' 
WHERE rev_code NOT LIKE '%rev5%' AND rev_code LIKE '%rev3%' 
+0

Msg 8152,Level 16,State 13,Line 1 字符串或二进制数据将被截断。 该声明已被终止。 错误? – mailtoasp

+0

rev_code的限制是什么? –

1

试试这个,

UPDATE table1 SET rev_code=rev_code +',rev5' 
where rev_code like '%rev3%' and Charindex('rev5', [rev_code])= 0 

编辑:

UPDATE table1 SET rev_code= rev_code +',rev5' 
where rev_code IS NOT NULL and rev_code like '%rev3%' and Charindex('rev5', [rev_code])= 0 

检查rev_code列大小。

而@Zohar Peled说,在存储逗号分隔值时,这是一个坏主意。

Is storing a delimited list in a database column really that bad?

+0

错误? Msg 8152,Level 16,State 13,Line 1 字符串或二进制数据将被截断。 该声明已被终止。 – mailtoasp

+0

@mailtoasp,你可以检查你的'rev_code'列大小。 –

0

哎哟......你有你的数据库设计错误,所以我会首先推荐创建额外的一个一对多的表,你将存储的字段:originalTableRecordId | rev_code

然后您会找到该表中具有特定rev_code值的所有记录,并将其添加到满足标准的那些记录中。

如果你不能改变你的数据库结构,那么你必须去与任一“WHERE rev_code LIKE‘%REV3%’”(这将是非常缓慢)或全文搜索(这是一个巨大的矫枉过正)

0

怎么样:

UPDATE table 
SET rev_code = rev_code+',rev5' 
WHERE rev_code LIKE '%rev3%' (OR RIGHT(rev_code,4) = 'rev3')