如何从列表中删除字符

时间:2015-05-28 12:42:00

标签: sql regex string postgresql substring

我有排,  例如: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行和第2行中的3和7?

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

3 个答案:

答案 0 :(得分:1)

以下内容应该在字符串的开头,字符串的末尾或中间的任何地方处理3或7。它还确保31中的3和17中的3不会被替换:

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](,)匹配字符串中间的a,3或7。这需要用一个逗号替换,该逗号由其周围的括号捕获 [37]$匹配字符串末尾以逗号开头的3或7。这应该没有任何替代。

\2用于替换字符串 - 对于上面的第二种情况,这是,,对于情况1和3,则为空。

答案 1 :(得分:0)

您可以使用以下语句更新所有记录。在下面的示例中,第一个语句将删除找到的任何 DateTime sentOnDateTime = DateTime.SpecifyKind(DateTime.Parse(sentOnString), DateTimeKind.Utc); 。然后执行下一个语句,找到字符串前面有,7的任何sting。

7

如果您还想删除所有出现的UPDATE test.table_4 SET list_id = REPLACE(list_id, ',7', '') UPDATE test.table_4 SET list_id = REPLACE(list_id, '7', '') ,请执行以下语句:

3

但是,存储在字符串中搜索agianst,with with等所需的值是一个糟糕的设计。

答案 2 :(得分: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