2016-04-21 33 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')