SQL UPDATE字符串中的特定字符

时间:2017-05-10 07:50:17

标签: sql sql-server

我有一个包含以下值的列(还有更多):

20150223-001
20150224-002
20150225-003

我需要写一个UPDATE语句,它会将短划线后的前两个字符更改为' AB'。结果必须如下:

 20150223-AB1
 20150224-AB2
 20150225-AB3

有人可以帮助我吗?

提前致谢。

5 个答案:

答案 0 :(得分:2)

使用此,

DECLARE @MyString VARCHAR(30) = '20150223-0000000001'

SELECT STUFF(@MyString,CHARINDEX('-',@MyString)+1,2,'AB')

答案 1 :(得分:0)

试,

update table set column=stuff(column,charindex('-',column)+1,2,'AB')

答案 2 :(得分:0)

Declare @Table1 TABLE (DateValue Varchar(50))
INSERT INTO @Table1
SELECT '20150223-000000001' Union all
SELECT '20150224-000000002' Union all
SELECT '20150225-000000003'

SELECT DateValue,
CONCAT(SUBSTRING(DateValue,0,CHARINDEX('-',DateValue)),
REPLACE(LEFT(SUBSTRING(DateValue,CHARINDEX('-',DateValue)+1,Len(DateValue)),2),'00','-AB'),
SUBSTRING(DateValue,CHARINDEX('-',DateValue)+1,Len(DateValue))) AS ExpectedDateValue
FROM @Table1

输出

   DateValue                ExpectedDateValue
---------------------------------------------
   20150223-000000001   20150223-AB000000001
   20150224-000000002   20150224-AB000000002
   20150225-000000003   20150225-AB000000003

更新

Update @Table1
SEt DateValue= CONCAT(SUBSTRING(DateValue,0,CHARINDEX('-',DateValue)),
REPLACE(LEFT(SUBSTRING(DateValue,CHARINDEX('-',DateValue)+1,Len(DateValue)),2),'00','-AB'),
SUBSTRING(DateValue,CHARINDEX('-',DateValue)+1,Len(DateValue)))
From @Table1

SELECT * from @Table1

输出

    DateValue
   -------------
20150223-AB000000001
20150224-AB000000002
20150225-AB000000003

答案 3 :(得分:0)

根据OP评论: -

  

它总是在破折号之前的8个字符,但是后面的字符   短跑可以变化。它必须更新破折号后的前两个。

使用下一个简单的代码: -

DECLARE @MyString VARCHAR(30) = '20150223-0000000001'

SELECT REPLACE(@MyString,SUBSTRING(@MyString,9,3),'-AB')

结果: -

20150223-AB00000001

答案 4 :(得分:0)

如果有大量数据,您可以考虑使用.WRITE子句。但它仅限于VARCHAR(MAX)NVARCHAR(MAX)VARBINARY(MAX)数据类型。

如果您有以下列类型之一,.WRITE子句最容易实现此目的,例如:

UPDATE Codes
SET val.WRITE('AB',9,2)
GO

其他可能的选择可能很简单REPLACE

UPDATE Codes
SET val=REPLACE(val,SUBSTRING(val,10,2),'AB')
GO

STUFF

UPDATE Codes
SET val=STUFF(val,10,2,'AB')
GO

我基于以下信息:列中总是有8个字符的日期和一个破折号。我准备了一张桌子并检查了这里提到的一些解决方案。

CREATE TABLE Codes(val NVARCHAR(MAX))

INSERT INTO Codes
SELECT TOP 500000 CONVERT(NVARCHAR(128),GETDATE()-CHECKSUM(NEWID())%1000,112)+'-00'+CAST(ABS(CAST(CHECKSUM(NEWID())%10000 AS INT)) AS NVARCHAR(128))
FROM sys.columns s1 CROSS JOIN sys.columns s2

我运行了一些测试,基于带有NVARCHAR(MAX)列的10kk行,我得到了以下结果:

+---------+------------+
| Method  |    Time    |
+---------+------------+
| .WRITE  | 28 seconds |
| REPLACE | 30 seconds |
| STUFF   | 15 seconds |
+---------+------------+

正如我们所看到的,STUFF看起来是更新字符串部分的最佳选择。在将新数据插入或附加到字符串中时应考虑.WRITE,如果数据库恢复模型设置为批量记录或简单,则可以利用最小化日志记录。根据MSDN文章UPDATE声明:Updating Large Value Data Types