如何在sql server中用new替换第二个位置字符串

ram*_* bk 5 sql-server sql-server-2008 sql-server-2012

我有一个问题:在sql server中,如何将第二次出现的字符串替换happy为字符串new,否则保持原样(相同).

表:

CREATE TABLE [dbo].[stringrep](
    [name] [varchar](100) NULL,
    [id] [int] NULL
) 
INSERT [dbo].[stringrep] ([name], [id]) VALUES (N'happy happy year', 1)
GO
INSERT [dbo].[stringrep] ([name], [id]) VALUES (N'very happy new year', 2)
GO
INSERT [dbo].[stringrep] ([name], [id]) VALUES (N'happy new year hello', 3)
GO
INSERT [dbo].[stringrep] ([name], [id]) VALUES (N'happy  happy year', 4)
GO
INSERT [dbo].[stringrep] ([name], [id]) VALUES (N'heloo year happy', 5)
GO
INSERT [dbo].[stringrep] ([name], [id]) VALUES (N'happy happy happy year', 6)
GO
Run Code Online (Sandbox Code Playgroud)

基于以上数据,我想要输出如下:

  id  |        Name 
  1   | happy new year
  2   | very happy new year
  3   | happy new year hello
  4   | happy  new year
  5   | heloo year happy
  6   |happy new happy year
Run Code Online (Sandbox Code Playgroud)

我尝试了以下查询:

SELECT replace ( name  ,'happy happy year' ,'happy new year')afterreplacename,
replace (  name, substring ('happy happy year'  ,6,6) ,' new')anotherway
,name ,[id]
  FROM [test].[dbo].[stringrep]
Run Code Online (Sandbox Code Playgroud)

上述查询未给出预期结果.

请告诉我如何在sql server中完成此任务.

Tim*_*sen 2

我设法提出以下查询。替换逻辑仅针对happy至少出现两次的数据。如果是,那么我们找到第二次出现的索引happy,然后将STUFFinnew作为替换。

SELECT
    data,
    CASE WHEN LEN(REPLACE(data, 'happy', '')) < LEN(data) - 6
         THEN STUFF(data,
                    CHARINDEX('happy', data, CHARINDEX('happy', data) + 1),
                     5,
                     'new')
         ELSE data END AS new_data
FROM yourTable;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

演示

happy请注意,此解决方案对于字符串中任意位置的两次(或多次)出现具有鲁棒性。请参阅此边缘情况的示例数据的最后一行。

我们宁愿在这里使用正则表达式,也许您的问题可以用一句话来回答。但是,SQL Server 没有良好的本机正则表达式支持,迫使我们改用基本字符串函数。