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中完成此任务.
我设法提出以下查询。替换逻辑仅针对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 没有良好的本机正则表达式支持,迫使我们改用基本字符串函数。
| 归档时间: |
|
| 查看次数: |
276 次 |
| 最近记录: |