我正在用SQL创建一个临时过程,因为我有一个用markdown编写的表的值,因此该表在Web浏览器中显示为HTML (markdown到HTML转换) 。
该列的字符串当前如下所示:
Questions about **general computing hardware and software** are off-topic for Stack Overflow unless they directly involve tools used primarily for programming. You may be able to get help on [Super User](http://superuser.com/about)
我目前正在使用粗体和斜体文本。这意味着 (以粗体显示的情况下), 我需要更换奇N次的格局**与<b>乃至倍</b>。 我看到了replace(),但是它在字符串的所有模式上执行替换。
**
<b>
</b>
那么,如何仅当它是奇数或偶数时才替换子字符串?
更新: 有些人想知道我使用的是哪种模式,所以请在这里看看。
如果需要,还可以添加一个额外的功能: 降到HTML链接的markdown样式的链接看起来并不那么简单。
使用该STUFF函数和一个简单的WHILE循环:
STUFF
WHILE
CREATE FUNCTION dbo.fn_OddEvenReplace(@text nvarchar(500), @textToReplace nvarchar(10), @oddText nvarchar(10), @evenText nvarchar(500)) RETURNS varchar(max) AS BEGIN DECLARE @counter tinyint SET @counter = 1 DECLARE @switchText nvarchar(10) WHILE CHARINDEX(@textToReplace, @text, 1) > 0 BEGIN SELECT @text = STUFF(@text, CHARINDEX(@textToReplace, @text, 1), LEN(@textToReplace), IIF(@counter%2=0,@evenText,@oddText)), @counter = @counter + 1 END RETURN @text END
您可以像这样使用它:
SELECT dbo.fn_OddEvenReplace(column, '**', '<b>', '</b>') FROM table
更新:
这被重写为SP:
CREATE PROC dbo.##sp_OddEvenReplace @text nvarchar(500), @textToReplace nvarchar(10), @oddText nvarchar(10), @evenText nvarchar(10), @returnText nvarchar(500) output AS BEGIN DECLARE @counter tinyint SET @counter = 1 DECLARE @switchText nvarchar(10) WHILE CHARINDEX(@textToReplace, @text, 1) > 0 BEGIN SELECT @text = STUFF(@text, CHARINDEX(@textToReplace, @text, 1), LEN(@textToReplace), IIF(@counter%2=0,@evenText,@oddText)), @counter = @counter + 1 END SET @returnText = @text END GO
并执行:
DECLARE @returnText nvarchar(500) EXEC dbo.##sp_OddEvenReplace '**a** **b** **c**', '**', '<b>', '</b>', @returnText output SELECT @returnText