如何用CHARINDEX()查找Name字段中首个Unicode字符的位置?
解决方案:查找首个Unicode字符(编码>0xFF)的位置
针对你的需求——找出tbName表Name字段中首个Unicode编码大于0xFF的字符位置,可以使用SQL Server的PATINDEX函数实现,无需复杂的自定义逻辑。
数据示例
你的表数据如下:
| Id | Name |
|---|---|
| 1 | \n汉字\n |
| 2 | \n 张三\n |
预期结果:第1行返回2,第2行返回3。
实现SQL语句
直接使用PATINDEX配合模式匹配,即可定位首个非ASCII(编码>0xFF)的字符:
SELECT Id, PATINDEX('%[^ -ÿ]%', Name) AS FirstUnicodeCharPosition FROM tbName
原理说明
[^ -ÿ]是正则匹配模式,代表不在ASCII空格(0x20)到扩展ASCII字符ÿ(0xFF)范围内的字符,也就是所有Unicode编码大于0xFF的字符。PATINDEX函数会返回字符串中第一个匹配该模式的字符位置,完全符合你的需求。
特殊场景处理
如果Name字段可能为空或不存在Unicode字符,PATINDEX会返回0,可通过CASE语句调整返回值:
SELECT Id, CASE WHEN PATINDEX('%[^ -ÿ]%', Name) > 0 THEN PATINDEX('%[^ -ÿ]%', Name) ELSE NULL -- 可替换为0或其他默认值 END AS FirstUnicodeCharPosition FROM tbName
你之前尝试的
CHARINDEX(CHAR(? >0xFF), Name)无法实现需求,因为CHAR函数仅能接收单个固定编码值,无法匹配范围;而PATINDEX的模式匹配天然支持范围筛选。
内容的提问来源于stack exchange,提问作者Zhang
相关产品推荐
相关产品推荐

