【发布时间】:2023-03-12 03:53:01
【问题描述】:
编辑:我有大约 80 个字符导致我的应用程序出现问题,所以我不想为每个字符硬编码一个 REPLACE。我认为创建一个包含两列“特殊字符”和“替换字符”的单独表会更容易,我将从包含“StringTest”列的原始表中删除这些列。我的目标是弄清楚如何使用字符表来替换字符串表中的字符。
我试图在 SQL Server 中将所有“特殊字符”(即 À、Æ、Ç)替换为“MappedCharacters”(A、AE、C)。我尝试了两种不同的技术,一种使用光标,一种不使用光标,以搜索字符串并将所有特殊字符替换为映射字符。我的每个方法只替换它们与字符串在同一行中的字符。 之前的例子:
num SpecialCharacter MappedCharacter StringTest
1 À A StringÀÆ
2 Æ AE ÆStringÆ
3 Ç C StrÇÀing
之后的示例:
num SpecialCharacter MappedCharacter StringTest
1 À A StringAÆ
2 Æ AE AEStringAE
3 Ç C StrCÀing
首选输出:
num SpecialCharacter MappedCharacter StringTest
1 À A StringAAE
2 Æ AE AEStringAE
3 Ç C StrCAing
所以你可以看到我想替换 StringTest 中的所有“特殊字符”,但只有同一行中的字符被替换。
我还没有完全弄清楚如何做到这一点。
这是我一直在尝试修改的两个 SQL 代码(我只需要一个即可)
第一种方法:
DECLARE @cASCIINum INT;
DECLARE @cSpecialChar VARCHAR(50);
DECLARE @cMappedChar VARCHAR(50);
DECLARE @cStringTest VARCHAR(50);
DECLARE @mapCursor as CURSOR;
SET @mapCursor = CURSOR FOR
SELECT [ASCIINum]
,[SpecialChar]
,[MappedChar]
,[StringTest]
FROM [intranet].[dbo].[CharMapTestTab];
OPEN @mapCursor;
FETCH NEXT FROM @mapCursor INTO @cASCIINum,
@cSpecialChar,
@cMappedChar,
@cStringTest;
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE [intranet].[dbo].[CharMapTestTab]
SET StringTest = REPLACE(StringTest, SpecialChar, MappedChar)
WHERE SpecialChar <> MappedChar
END
CLOSE @mapCursor;
DEALLOCATE @mapCursor;
第二种方法:
DECLARE @ASCIINum INT = 0
WHILE (1 = 1)
BEGIN
SELECT @ASCIINum = ASCIINum
FROM [intranet].[dbo].[CharMapTestTab]
WHERE ASCIINum > @ASCIINum
ORDER BY ASCIINum
IF @@ROWCOUNT = 0 BREAK;
UPDATE [intranet].[dbo].[CharMapTestTab]
SET StringTest = REPLACE(StringTest, SpecialChar, MappedChar)
WHERE SpecialChar <> MappedChar
SELECT TOP 1000 [ASCIINum]
,[SpecialChar]
,[MappedChar]
,[StringTest]
FROM [intranet].[dbo].[CharMapTestTab]
END
【问题讨论】:
-
哪个数据库?甲骨文? SQL 服务器? MySQL?等
-
您还需要在循环中使用 Fetch Next。就像在 Fetch first while @@FetchStatus = 0 做某事 FetchNext end
-
这是在 SQL Server Thit Lwin Oo 中
-
这两个都是光标
标签: sql tsql replace cursor special-characters