我正在拥有一个名为CDR的列。 在该CDR列中,我们将值存储为逗号分隔,如20,5,40,10,30 我只需要在每一行中将最后一个值(此处为30)替换为0。 有人可以建议我怎么做?
由于
答案 0 :(得分:1)
如果可以,请先更正数据库设计,因为表格不是第一范式。将一个以上的值存储在一列中是不好的设计,正如您必须提出这个问题所证明的那样。 :-)尽管如此,我必须处理具有我无法控制的相同问题的供应商数据,因此在Oracle 11g中我会这样做:
update table_name
set CDR = regexp_replace(CDR, '(.*,)\d+$', '\10');
正则表达式匹配并记住在字符串结尾之前的一个或多个数字之前的所有字符,包括最后一个逗号。替换字符串是由\ 1引用的记忆部分,指的是括号内的第一个字符分组),加上0。
答案 1 :(得分:0)
如果您使用的是SQL Server,这应该适合您。
create table #A(id int , cdr varchar(100))
insert into #A values(1,'10,20,30,40'),(2, '20,30,40,50'),(3,'30,40,50,60,70')
Declare @tA as table(id int , String varchar(10))
insert into @tA
SELECT id,
Split.a.value('.', 'VARCHAR(100)') AS String
FROM (SELECT [id],
CAST ('<M>' + REPLACE([cdr], ',', '</M><M>') + '</M>' AS XML) AS String
FROM #A) AS A CROSS APPLY String.nodes ('/M') AS Split(a);
delete from @tA where [String] = '30'
SELECT distinct id,
ISNULL(STUFF((SELECT ', ' + String
FROM @tA t
WHERE t.id = ta.id
FOR XML PATH('')
), 1, 1, ''), '') AS Str
into #tempA
FROM @tA ta
select * from #tempA
drop table #A, #tempA
答案 2 :(得分:0)
UPDATE TableName
SET CDR = REPLACE(CDR, (SUBSTRING( CDR, LEN(CDR) - CHARINDEX(',',REVERSE(CDR)) + 2 , LEN(CDR))),0);
答案 3 :(得分:0)
您应该考虑将逗号分隔列表拆分为单独的表。这样你就可以在SQL中做其他事情了。 SQL不是最好的字符串操作,你的查询会变得淫秽和不守规矩。
table Users
user_id user_name job_list
1 Billy "1,2,3,4"
table Jobs
job_id job_desc
1 plumber
2 carpenter
3 electrician
4 programmer
如果你这样做,你会有一些心痛,工作会消失,或者你会有很多令人讨厌的清理工作,如@jarlh所说。
如果您制作第三个表来保存关系user_id
到job_id
,那么如果您需要执行删除job_id
之类的操作,那么您将有更好的时间。当然,这一切都是基于你有限的问题弥补的,但它应该会帮助你。
table UserJobRelationship
relationship_id user_id job_id
1 1 1
2 1 2
3 1 3
4 1 4
为您提供更大的灵活性,并允许您删除最新的条目。您只需max
relationship_id
user_id
{{1}}等于该用户,或者您可以为整个表执行此操作。