2015-05-28 58 views
0

刪除角色我都行, 例如:1,2,3,5,9,7 - >不是在(3,7) (這個字需要刪除 - >結果選擇1,2,5,9 如何做到這一點如何從列表

例如? :

drop table test.table_4; 
create table test.table_4 (
    id integer, 
    list_id text 
); 
insert into test.table_4 values(1,'1,2,3,5,9,7'); 
insert into test.table_4 values(2,'1,2,3,5'); 
insert into test.table_4 values(3,'7,9'); 
insert into test.table_4 values(5,'1,2'); 
insert into test.table_4 values(9,'1'); 
insert into test.table_4 values(7,'5,7,9'); 

查詢:

select list_id from test.table_4 where id not in (3,7) --return 4 row 

    id list_id 
1. 1  '1,2,3,5,9,7' 
2. 2  '1,2,3,5' 
3. 5  '1,2' 
4. 9  '1' 

如何在第1行刪除3,7和2

id 
1. 1  '1,2,5,9' 
2. 2  '1,2,5' 
3. 5  '1,2' 
4. 9  '1' 
+0

你能建立一個sqlfiddle HTTP://sqlfiddle.com/ –

+1

你問如何刪除字符串中的任何'7'?還是你問如何刪除最後一個字符?請澄清。 – Linger

+0

@Linger或第一個字符不是爲了^ ^。如此多的可能性。 – ShellFish

回答

1

下應在字符串的開始處理3或7,在字符串,或在中間的任何位置結束。這也確保了31 3和17 7不被替換:

select 
    list_id, 
    regexp_replace(list_id, '(^[37],|,[37](,)|,[37]$)', '\2', 'g') 
from test.table_4 
where id not in (3,7) 

說明:
^[37],相匹配的3或7然後在字符串的開頭逗號。這應該被替換爲無。
,[37](,)相匹配的,3個,或,如圖7所示,在字符串的中間。這需要用一個逗號替換,逗號由括號括起來。
[37]$相匹配的3或7在字符串的前面端通過逗號。這應該被替換爲無。

\2是用來替換的字符串 - 這是,上面第二種情況下,空的情況下,1和3

+0

TobyLL,謝謝!!! – Testudinate

0

您可以使用以下語句更新所有記錄。在下面的例子中,第一條語句將刪除找到的所有,7。然後執行下一條語句,查找字符串前面的7

UPDATE test.table_4 SET list_id = REPLACE(list_id, ',7', '') 
UPDATE test.table_4 SET list_id = REPLACE(list_id, '7', '') 

如果您也想刪除的3所有出現然後執行以下語句:

UPDATE test.table_4 SET list_id = REPLACE(list_id, ',3', '') 
UPDATE test.table_4 SET list_id = REPLACE(list_id, '3', '') 

然而,這是一個糟糕的設計,你需要agianst搜索存儲值,工作着,等字符串。

+0

數據不需要update.query顯示沒有id 3和7的字符串。 – Testudinate

0

您可以使用regexp_replace獲得預期的輸出:

select id, regexp_replace(list_id,'3,|,7', '','g') 
from table_4 
where id not in (3,7) 

輸出:

id regexp_replace 
1 1,2,5,9 
2 1,2,5 
5 1,2 
9 1 

這裏是SQL Fiddle