替换字符串中N位置的字符

时间:2014-12-18 16:55:20

标签: sql-server string replace

我想替换字符串中N位置的字符。这是我的疑问:

SELECT code FROM tablecodes

结果是3行:

AXGETYTRTFYZUFYZFFFDIZEG
GFYZUFYZFAXFCDIZAX
ZUFYZGEFYFAXFFIXZRA

我无法弄清楚如何用'A'替换​​每行上的最后一个'Z'字符。我希望结果看起来像这样:

AXGETYTRTFYZUFYZFFFDIAEG
GFYZUFYZFAXFCDIAAX
ZUFYZGEFYFAXFFIXARA

'Z'字符始终位于相同的位置(字符串的长度 - 3)

有什么建议吗? 感谢。

3 个答案:

答案 0 :(得分:3)

使用Stuff功能

示例:

SELECT Stuff('AXGETYTRTFYZUFYZFFFDIZEG', Len('AXGETYTRTFYZUFYZFFFDIZEG') - 2, 1, 'A') 

Select查询应该像

Select Stuff(code, Len(code) - 2, 1, 'A')

答案 1 :(得分:1)

替换特定位置的任何字符都可以使用填充函数

SELECT STUFF('XYZABC', CHARINDEX('A', 'XYZABC'), 1, '#')

根据您的问题,这是解决方案。

DECLARE @stringTable AS TABLE(STRING VARCHAR(50))
INSERT INTO @stringTable
VALUES('AXGETYTRTFYZUFYZFFFDIZEG'),
      ('GFYZUFYZFAXFCDIZAX'),
      ('ZUFYZGEFYFAXFFIXZRA')

SELECT STRING AS [Old String], 
       STUFF(STRING, LEN(STRING) - CHARINDEX('Z', REVERSE(STRING))+1, 1, 'A') AS [New String]
FROM @stringTable


 --------------------------------------------------------
|       Old String          |      New String            |
 --------------------------------------------------------
|  AXGETYTRTFYZUFYZFFFDIZEG |  AXGETYTRTFYZUFYZFFFDIAEG  |
|  GFYZUFYZFAXFCDIZAX       |  GFYZUFYZFAXFCDIAAX        |
|  ZUFYZGEFYFAXFFIXZRA      |  ZUFYZGEFYFAXFFIXARA       |
 --------------------------------------------------------

答案 2 :(得分:0)

您可以通过以下几种方式实现目标:

http://sqlfiddle.com/#!6/af25d/2

select left(code, len(code)-3) + 'A' + right(code, 2)
from tableCodes

请注意,这并没有进行任何类型的验证,即字符串足够长以执行操作 - 所以要小心。

不确定你是否“总是”将Z作为字符串中第三个到最后一个字符,所以如果你需要在进行替换之前另外检查它,你可以这样做:

select 
    CASE WHEN SUBSTRING(code, len(code)-2, 1) = 'Z' 
        THEN left(code, len(code)-3) + 'A' + right(code, 2)
        ELSE code
    end AS code
from tableCodes