2013-04-26 77 views
4

我是相当新的SQL,我尝试做以下操作:更新部分

我有一列数据,我们将其称之为CATEGORY,该列中的数据如下:

插孔,鳃,撬,吉尔,杰克,保罗,约翰尼,是良好的,平纹呢,塞米, 约翰

在第二表我有一个映射的条目

列1 Johnny, be, good - 列2 johnny be good

我需要能够为Johnny, be, good该类别中的值更新为johnny be good,但列的只是一部分。我已经试了好东西,下面是我的尝试之一:

这里只是想选择,出现这种情况

SELECT * FROM [dbo].[TD_DTV_BV_CATALOGITEMS] a 
INNER JOIN 
[dbo].[TD_CATEGORYMAP] b ON 
a.[COURSE_CATEGORY] LIKE b.[GROUPCATEGORY] 

这里是行,我试图更新列,当然这是无效。

UPDATE [dbo].[TD_DTV_BV_CATALOGITEMS] a 
SET a.COURSE_CATEGORY = REPLACE(a.COURSE_CATEGORY, b.MAPCATEGORY) 
INNER JOIN 
[dbo].[TD_CATEGORYMAP] b ON 
a.[COURSE_CATEGORY] LIKE b.[GROUPCATEGORY] 

在此先感谢您的帮助。

+0

'替换()'需要3个参数。 '替换(source_text,text_to_find,replacement_text)'。除非你正在尝试进行部分字符串替换,为什么不只是'SET a.COURSE_CATEGORY = b.MAPCATEGORY'呢? – 2013-04-26 20:38:46

+0

@Marc,OP明确表示他想做部分替换。 – 2013-04-26 20:39:46

+1

对不起,你会在一个**单**列中出现'jack,gill,tommy,jill,jacky,paul,johnny,be,good,tammy,sammy,john'如果是的话,停止你在做什么,并阅读关于数据库规范化。 – Kermit 2013-04-26 20:41:06

回答

0

假设你是MSSQL,试试这个

SQL Fiddle

MS SQL Server 2008的架构设置

create table t ( 
    id int not null identity(1, 1), 
    category varchar(max) 
) 

create table map (
    col1 varchar(max), col2 varchar(max) 
) 

insert t (category) 
values ('jack, gill, tommy, jill, jacky, paul, Johnny, be, good, tammy, sammy, john'), 
    ('jack, gill, tommy, jill, jacky, paul, Johnny, be, good'), 
    ('Johnny, be, good, tammy, sammy, john') 

insert map (col1, col2) 
values ('Johnny, be, good', 'johnny be good') 

查询1

update t set 
    category = replace(category, m.col1, m.col2) 
from t 
    join map m on t.category like m.col1 + '%' --in the begining 
    or t.category like '%, ' + m.col1 + ',%' --in the middle 
    or t.category like '%, ' + m.col1  --in the end 

select * from t 

Results

| ID |                 CATEGORY | 
--------------------------------------------------------------------------------- 
| 1 | jack, gill, tommy, jill, jacky, paul, johnny be good, tammy, sammy, john | 
| 2 |      jack, gill, tommy, jill, jacky, paul, johnny be good | 
| 3 |          johnny be good, tammy, sammy, john | 
+0

感谢所有伟大的回复。这就是我最终希望它能帮助未来的人: \t \t UPDATE \t \t \t [dbo]。[TD_DTV_BV_CATALOGITEMS] \t \t SET \t \t \t [COURSE_CATEGORY] = REPLACE([COURSE_CATEGORY],[GROUPCATEGORY],[MAPCATEGORY]) \t \t FROM \t \t \t [DBO]。[TD_DTV_BV_CATALOGITEMS],[DBO]。[ TD_CATEGORYMAP] \t \t WHERE \t \t \t [COURSE_CATEGORY] LIKE '%' + [DBO]。[TD_CATEGORYMAP] [GROUPCATEGORY] + '%' – 2013-04-30 13:22:58