Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何替换SQL中用逗号分隔的列值_Sql - Fatal编程技术网

如何替换SQL中用逗号分隔的列值

如何替换SQL中用逗号分隔的列值,sql,Sql,我有一个表,它有一个名为CDR的列。 在CDR列中,我们将值存储为逗号分隔,如20,5,40,10,30 我只需要替换最后一个值,这里每行的值是30比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') Decla

我有一个表,它有一个名为CDR的列。 在CDR列中,我们将值存储为逗号分隔,如20,5,40,10,30 我只需要替换最后一个值,这里每行的值是30比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

如果可以,请首先更正数据库设计,因为表不是第一个正常形式。在一列中存储多个值是一种糟糕的设计,您必须问这个问题就证明了这一点:话虽如此,我必须处理与我无法控制的更改问题相同的供应商数据,因此在Oracle 11g中,我将这样做:

update table_name
set CDR = regexp_replace(CDR, '(.*,)\d+$', '\10');
正则表达式匹配并记住字符串结尾前一个或多个数字前的所有字符,包括最后一个逗号。替换字符串是\1引用的记忆部分,指括号内的第一组字符加上0

UPDATE TableName
   SET CDR = REPLACE(CDR, (SUBSTRING( CDR, LEN(CDR) -  CHARINDEX(',',REVERSE(CDR)) + 2  , LEN(CDR))),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建议的那样,你会有很多烦人的清理工作

如果您制作第三个表来保存用户id与作业id之间的关系,那么如果您需要执行诸如从存在中删除作业id之类的操作,您将有一个更好的时间。当然,这些都是根据你有限的问题编造的,但它应该能帮助你解决问题

table UserJobRelationship
relationship_id     user_id       job_id
1                   1             1
2                   1             2
3                   1             3
4                   1             4

为您提供了更大的灵活性,并允许您删除最近的条目。您可以简单地执行关系id的最大值,其中用户id等于该用户,或者您可以对整个表执行此操作

您正在使用MsSQL服务器吗?永远不要将数据存储为逗号分隔的项目。这只会给您带来很多麻烦。您使用的是什么数据库?您可以使用代码进行操作。如果您更新标记以包含您使用的RDM,您将获得更准确的答案。此处显示的是\10是什么?请参阅最后一句。对第一个记忆中的组\1的引用,该组是除列表中最后一个元素外的整个字符串,与“0”连接。很抱歉,它对我无效,因为CHARINDEX在SQL中不兼容。此答案适用于MSSQL Server。CHARINDEX函数可用于以下版本的SQL Server 2014、SQL Server 2012、SQL Server 2008 R2、SQL Server 2008和SQL Server 2005