2013-03-12 32 views
1

更新表'commission'中的某些行时出现问题。现在我有了像bar/123/456这样的commission_number。我想它重命名为约翰/四百五十六分之一百二十三等,从“用户”表Postgres - 更改列数据

commission      user 
-------------------------  ----------------- 
commission_number|user_id   username|user_id 
-------------------------  ----------------- 
bar/123/456  | 1    John | 1 
bar/123/123  | 2    Bob | 2 
bar/456/123  | 3    Thomas | 3 

取一个名字下面是我的查询,以“巴兹”工作。但不知道如何从'用户'表中放置'用户名'。我只需要替换'baz',并使用'user'的用户名,但是不知道如何。

UPDATE commission 
SET commission_number = overlay(commission_number placing 'baz' FROM POSITION('bar' IN commission_number) for 3) 
WHERE commission_number in (1,2,3,4,5,6,7,8) 
+0

为什么你存储的用户名中commission_number呢?您不应该存储可以从现有内容派生的数据。 – 2013-03-12 13:40:19

+0

我在我们公司的系统中发现了一个错误,必须重命名它。我不能改变表格结构,我不是开发者:( – ssuperczynski 2013-03-12 13:44:39

+1

然后告诉谁是负责任的,这是一个可怕的表格设计(你可以引用我) – 2013-03-12 13:47:42

回答

1

我会用类似试验开始......

UPDATE commission 
SET commission_number = 
    (SELECT UserName FROM User WHERE user.user_id=commission.user_id) 
    ||SubString(commission_number,4,8000) 

还有right(commission_number,-3)得到所有但从第3个字符。

我不确定你想要做什么
WHERE commission_number in (1,2,3,4,5,6,7,8)

+0

你需要'TRIM' **用户名**在连接之前? – 2013-03-12 13:46:13

+0

如果佣金号码与“bar”的前缀不同(较长),这会做错误的事情 – 2013-03-12 13:48:35

+0

是的,如果这是一个要求,那么你需要看看如果使用'replace' if你知道你要更换什么,否则你寻找第一个/的技术是一个好的:) – 2013-03-12 13:51:00

3
update commission 
    set commission_number = u.username || '/' || left(commission_number, -strpos(commission_number, '/')) 
from users u 
    where u.user_id = commission.user_id 
1

这说明了更新后数据的外观。当我使用字符串函数时,我使用这种select语句很多。

select c.commission_number, c.user_id, 
     (select username 
     from "user" 
     where "user".user_id = c.user_id) username, 
     overlay(c.commission_number 
       placing (select username 
         from "user" 
         where "user".user_id = c.user_id) 
       from 1 for 3) 
from commission c; 

现在您可以按照您知道的方式编写更新声明。

update commission 
set commission_number = overlay(commission_number 
           placing (select username 
             from "user" 
             where "user".user_id = commission.user_id) 
           from 1 for 3); 
1

尝试此查询:

update commission 
set commission_number=user_table.user_name+ 
    SUBSTRING(SUBSTRING(commission.commission_number,CHARINDEX('/',commission.commission_number,1)+0,LEN(commission.commission_number)) 
       ,1 
       ,CHARINDEX('/',SUBSTRING(commission.commission_number,CHARINDEX('/',commission.commission_number,1)+1,LEN(commission.commission_number)),1)+LEN(commission.commission_number)) 
from commission 
inner join user_table on user_table.user_id=commission.user_id 

核实Sql Fiddle

花了一点时间来证明对SQL小提琴