如何在SQL Server的CASE语句中处理Unicode特殊字符
移除nvarchar列开头的特殊Unicode字符问题
我有一个nvarchar类型的列,部分值包含特殊Unicode字符。需求是:如果值以特殊字符开头,就移除该字符;否则保留原值。
示例数据
| ID | Amount |
|---|---|
| 1 | 999.09999.09 |
| 2 | 339.58339.58 |
| 3 | 2141.12055.72357.6 |
| 4 | 519.32519.32 |
| 5 | 661.84661.84 |
| 6 | 843.59843.59 |
我尝试用STUFF函数移除开头的特殊字符,单个值处理有效,但结合CASE语句应用到整列时,LIKE操作符无法正确匹配开头的特殊字符。尝试的查询语句如下:
尝试的查询语句
SELECT ID, CASE WHEN Amount LIKE N'%' THEN (STUFF (Amount, 1, 1, '')) ELSE Amount END AS Test, FROM table
预期结果
| ID | Amount | Test |
|---|---|---|
| 1 | 999.09999.09 | 999.09999.09 |
| 2 | 339.58339.58 | 339.58339.58 |
| 3 | 2141.12055.72357.6 | 2141.12055.72357.6 |
| 4 | 519.32519.32 | 519.32519.32 |
| 5 | 661.84661.84 | 661.84661.84 |
| 6 | 843.59843.59 | 843.59843.59 |
解决方案
问题分析
当前代码的核心问题是匹配字符错误:示例中开头的特殊字符是,但代码里用做LIKE匹配,导致无法命中目标行。此外,针对Unicode字符的匹配,除了确保N前缀,还可以用更直接的方式避免编码问题。
修正后的查询
方法1:修正LIKE匹配的字符
SELECT ID, Amount, CASE WHEN Amount LIKE N'%' -- 匹配正确的开头特殊字符 THEN STUFF(Amount, 1, 1, '') ELSE Amount END AS Test FROM [table] -- table是关键字,建议加方括号避免语法错误
方法2:用LEFT函数直接判断首字符
如果担心LIKE对Unicode字符的匹配兼容性,可以直接提取首字符对比:
SELECT ID, Amount, CASE WHEN LEFT(Amount, 1) = N'' THEN STUFF(Amount, 1, 1, '') ELSE Amount END AS Test FROM [table]
方法3:兼容多种开头特殊字符
如果存在多种需要移除的开头特殊字符(比如有效值以数字开头),可以用PATINDEX匹配非数字开头的情况:
SELECT ID, Amount, CASE WHEN PATINDEX(N'[^0-9]%', Amount) = 1 THEN STUFF(Amount, 1, 1, '') ELSE Amount END AS Test FROM [table]
内容的提问来源于stack exchange,提问作者K H A N
相关产品推荐
相关产品推荐

