SQL Server 2008 R2用RIGHT+CASE判断字段末字符失效怎么办
问题原因及解决方案
1. 工具自动修正后的语句存在明确语法错误
工具生成的CASE RIGHT ('LRIGLOT. 1')有两个核心错误:
- 把字段名
LRIGLOT加了单引号,变成了固定字符串'LRIGLOT. 1',不再读取表中该字段的实际值 - 丢失了
RIGHT函数的第二个参数(指定截取字符数的参数),RIGHT(字段名, 截取长度)是SQL Server的标准语法,必须传入两个参数
这种写法下RIGHT返回的永远是固定字符串的最后一位,自然不可能匹配到'C',一定会走ELSE分支。
2. 原语句执行不符合预期的常见排查点
你手动写的原生CASE逻辑本身语法是正确的,如果执行不符合预期,可按以下顺序排查:
- 大小写匹配问题:SQL Server默认大小写不敏感,但如果当前库/表/字段的排序规则是大小写敏感的,字段最后一位小写
c不会匹配大写'C',可以改成CASE RIGHT(UPPER(LRIGLOT),1)规避大小写问题 - 字段末尾存在不可见字符:比如空格、换行符、制表符等,先对字段做去末尾空白处理再截取,修改为
CASE RIGHT(RTRIM(LRIGLOT),1) - 字段值为空:如果
LRIGLOT为NULL的话,RIGHT返回值也是NULL,不会匹配'C',可以补充NULL值的处理逻辑,最终优化后的语句如下:
CASE WHEN LRIGLOT IS NULL THEN 'NON CERTIFICATE' WHEN RIGHT(RTRIM(UPPER(LRIGLOT)), 1) = 'C' THEN 'CERTIFICATE' ELSE 'NON CERTIFICATE' END
3. 视图设计器自动修正的规避方法
SQL Server自带的视图可视化设计器经常会自动篡改用户输入的自定义表达式,建议直接用SQL语句创建/修改视图,不要用可视化设计器编辑计算列,示例创建视图语句:
CREATE VIEW 你的视图名 AS SELECT 其他原有字段, CASE WHEN LRIGLOT IS NULL THEN 'NON CERTIFICATE' WHEN RIGHT(RTRIM(UPPER(LRIGLOT)), 1) = 'C' THEN 'CERTIFICATE' ELSE 'NON CERTIFICATE' END AS 新增列名 FROM 你的表名
内容的提问来源于stack exchange,提问作者Nicola
相关产品推荐
相关产品推荐

