ssuperczynski
ssuperczynski

Reputation: 3426

Postgres - change column data

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

Answers (4)

Prahalad Gaggar
Prahalad Gaggar

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

AjV Jsy
AjV Jsy

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

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

user330315
user330315

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

Related Questions