Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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_Sql Server - Fatal编程技术网

Sql 增加字符串中的数字

Sql 增加字符串中的数字,sql,sql-server,Sql,Sql Server,有些对象被编码为key:value字符串并存储在一个表中,我想增加所有对象的序列号,这是对象中的一个字段 例如: ID Value -------------------------- 504 s:0;d:n;e:test; 506 s:1;d:y;e:branch; 507 s:2;d:y;e:; 我想把它们改为: ID Value -------------------------- 504 s:1;d:n;e:test; 506 s:2;d:y;e:branch; 50

有些对象被编码为key:value字符串并存储在一个表中,我想增加所有对象的序列号,这是对象中的一个字段

例如:

ID   Value
--------------------------
504  s:0;d:n;e:test;
506  s:1;d:y;e:branch;
507  s:2;d:y;e:;
我想把它们改为:

ID   Value
--------------------------
504  s:1;d:n;e:test;
506  s:2;d:y;e:branch;
507  s:3;d:y;e:;
有没有一个简单的方法可以做到这一点

有没有一个简单的方法可以做到这一点

不,不是真的

您可以找到
s:
d:
的位置,然后使用它们提取中间的数字,将其增加1,并填充回它所属的位置

declare @T table
(
  ID int,
  Value varchar(50)
);

insert into @T values
(504, 's:0;d:n;e:test;'),
(506, 's:1;d:y;e:branch;'),
(507, 's:2;d:y;e:;');

select T.ID,
       stuff(T.Value, P.S, P.D - P.S - 1, S.Value) as NewValue
from @T as T
  cross apply (values(charindex('s:', T.Value) + 2, 
                      charindex('d:', T.Value))) as P(S, D)
  cross apply (values(substring(T.Value, P.S, P.D - P.S - 1) + 1)) as S(Value)
您可以在其中找到
s:
之后,而不是Eric在评论中建议的
d:

select T.ID,
       stuff(T.Value, S.Pos, SEnd.Pos - S.Pos, V.NewValue) as NewValue
from @T as T
  cross apply (values(charindex('s:', T.Value) + 2)) as S(Pos)
  cross apply (values(charindex(';', T.Value, S.Pos))) as SEnd(Pos)
  cross apply (values(substring(T.Value, S.Pos, SEnd.Pos - S.Pos) + 1)) as V(NewValue)
有没有一个简单的方法可以做到这一点

不,不是真的

您可以找到
s:
d:
的位置,然后使用它们提取中间的数字,将其增加1,并填充回它所属的位置

declare @T table
(
  ID int,
  Value varchar(50)
);

insert into @T values
(504, 's:0;d:n;e:test;'),
(506, 's:1;d:y;e:branch;'),
(507, 's:2;d:y;e:;');

select T.ID,
       stuff(T.Value, P.S, P.D - P.S - 1, S.Value) as NewValue
from @T as T
  cross apply (values(charindex('s:', T.Value) + 2, 
                      charindex('d:', T.Value))) as P(S, D)
  cross apply (values(substring(T.Value, P.S, P.D - P.S - 1) + 1)) as S(Value)
您可以在其中找到
s:
之后,而不是Eric在评论中建议的
d:

select T.ID,
       stuff(T.Value, S.Pos, SEnd.Pos - S.Pos, V.NewValue) as NewValue
from @T as T
  cross apply (values(charindex('s:', T.Value) + 2)) as S(Pos)
  cross apply (values(charindex(';', T.Value, S.Pos))) as SEnd(Pos)
  cross apply (values(substring(T.Value, S.Pos, SEnd.Pos - S.Pos) + 1)) as V(NewValue)
您可以在UPDATE语句中使用SELECT查询中的内容来更改表值


您可以在UPDATE语句中使用SELECT查询中的内容,通过以下拆分字符串函数更改表值:


从这里使用拆分字符串函数:


这说明了空值或非整数值;如果它们不能增加1,它将忽略它们

-- Build Test Data
IF OBJECT_ID('tempdb..#test') IS NOT NULL DROP TABLE #test
CREATE TABLE #test (ID INT, Value VARCHAR(100))

INSERT #test
VALUES 
(504,'s:0;d:n;e:test;'),
(506,'s:1;d:y;e:branch;'),
(507,'s:2;d:y;e:;'),
(508,'s:;d:y;e:;'),
(509,'s:xyz;d:y;e:;');

-- Update S: values
WITH sVals AS
(
    SELECT ID, Value, TRY_PARSE(SUBSTRING(Value,CHARINDEX('s:',Value)+2,CHARINDEX(';',Value,CHARINDEX('s:',Value))-(CHARINDEX('s:',Value)+2)) AS INT) AS sVal
    FROM #test AS t
)
UPDATE s
SET Value = IIF(sVal IS NOT NULL, STUFF(Value,CHARINDEX('s:',Value)+2,CHARINDEX(';',Value,CHARINDEX('s:',Value))-(CHARINDEX('s:',Value)+2),sVal+1), Value)
FROM sVals AS s

-- Check the results
SELECT *
FROM #test

这说明了空值或非整数值;如果它们不能增加1,它将忽略它们

-- Build Test Data
IF OBJECT_ID('tempdb..#test') IS NOT NULL DROP TABLE #test
CREATE TABLE #test (ID INT, Value VARCHAR(100))

INSERT #test
VALUES 
(504,'s:0;d:n;e:test;'),
(506,'s:1;d:y;e:branch;'),
(507,'s:2;d:y;e:;'),
(508,'s:;d:y;e:;'),
(509,'s:xyz;d:y;e:;');

-- Update S: values
WITH sVals AS
(
    SELECT ID, Value, TRY_PARSE(SUBSTRING(Value,CHARINDEX('s:',Value)+2,CHARINDEX(';',Value,CHARINDEX('s:',Value))-(CHARINDEX('s:',Value)+2)) AS INT) AS sVal
    FROM #test AS t
)
UPDATE s
SET Value = IIF(sVal IS NOT NULL, STUFF(Value,CHARINDEX('s:',Value)+2,CHARINDEX(';',Value,CHARINDEX('s:',Value))-(CHARINDEX('s:',Value)+2),sVal+1), Value)
FROM sVals AS s

-- Check the results
SELECT *
FROM #test
您可以按以下方式进行操作:

DECLARE @val VARCHAR(100) = 's:12;d:n;e:test;'
SELECT  REPLACE(@val, ':' + SUBSTRING(@val, 3,  PATINDEX('%;d:%',  @val) - 3) + ';',  ':' + CAST(SUBSTRING(@val, 3,  PATINDEX('%;d:%',  @val) - 3)+ 1 AS VARCHAR(MAX)) + ';')
结果:
s:13;d:n;e:试验

您可以如下所示:

DECLARE @val VARCHAR(100) = 's:12;d:n;e:test;'
SELECT  REPLACE(@val, ':' + SUBSTRING(@val, 3,  PATINDEX('%;d:%',  @val) - 3) + ';',  ':' + CAST(SUBSTRING(@val, 3,  PATINDEX('%;d:%',  @val) - 3)+ 1 AS VARCHAR(MAX)) + ';')

结果:
s:13;d:n;e:试验

数字是否总是出现在d之前,并且sNumbers总是一位数?数字是否总是出现在d之前,并且sNumbers总是一位数?假设该列<1000个字符。如果需要,则将该值设置为更高。假设该列小于1000个字符。如果需要,请将该值设置得更高我认为可以获得
的charindex
而不是
d:
符合字段的实际用法,因为它是
key:value。d不必出现在s之后。@Eric是的,那会更好。我更新了答案。我想获得
的charindex
而不是
d:
符合字段的实际用法,因为它是
key:value。d不必出现在s之后。@Eric是的,那会更好。我更新了答案。