Reputation: 3426
Have a problem with update some rows in table 'commission'. Now I have commission_number like bar/123/456. I'd like to rename it to John/123/456 etc, taking a name from 'user' table
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
Below is my query, working with 'baz'. But don't know how to place 'username' from 'user' table. I only need to replace 'baz', and use username from 'user', but don,t know how.
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)
Upvotes: 1
Views: 275
Reputation: 11609
Try this query:
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
Verify on Sql Fiddle
Took a bit of time to show on SQL Fiddle
Upvotes: 1
Reputation: 6095
I'd start by experimenting with something like...
UPDATE commission
SET commission_number =
(SELECT UserName FROM User WHERE user.user_id=commission.user_id)
||SubString(commission_number,4,8000)
There's also right(commission_number,-3)
to get all but the first 3 chars from that.
I'm not sure what you're trying to do with
WHERE commission_number in (1,2,3,4,5,6,7,8)
?
Upvotes: 1
Reputation: 95760
This illustrates how the data will look after the update. I use this kind of select statement a lot when I'm working with string functions.
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;
Now you can write the update statement in terms that you know will work.
update commission
set commission_number = overlay(commission_number
placing (select username
from "user"
where "user".user_id = commission.user_id)
from 1 for 3);
Upvotes: 1
Reputation:
update commission
set commission_number = u.username || '/' || left(commission_number, -strpos(commission_number, '/'))
from users u
where u.user_id = commission.user_id
Upvotes: 3