2013-03-12 31 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小提琴