Oracle中拼接姓名字段求长度遇NULL值的问题咨询
解决Oracle中姓名字段拼接长度计算的问题
嗨,我来帮你搞定这个Oracle里的字符串长度计算问题~ 先拆解下你遇到的两个问题的原因,再给你靠谱的解决方案:
为什么会出现这些问题?
1. LENGTH(p.firstName + p.lastName)报ORA-01722错误
在Oracle里,+是算术加法运算符,不是字符串拼接的符号!当你用+连接firstName和lastName时,Oracle会默认尝试把这两个字符串转换成数字做加法运算。但姓名显然是文本内容,没法转成数字,所以就抛出了「ORA-01722 无效数字」的错误。
2. LENGTH(p.firstName) + LENGTH(p.lastName)结果为NULL
这是Oracle里NULL的特性导致的:任何值和NULL进行运算,结果都会变成NULL。只要p.lastName是NULL,LENGTH(p.lastName)就会返回NULL,哪怕p.firstName有值,整个求和的结果也会变成NULL。
正确的解决方案
这里有两种靠谱的写法,你可以根据习惯选择:
方法一:先正确拼接字符串再计算长度
用Oracle的字符串拼接运算符||,再配合NVL()函数把NULL的lastName转换成空字符串,这样拼接后的结果就不会有NULL干扰了:
LENGTH(p.firstName || NVL(p.lastName, ''))
- 原理:
NVL(p.lastName, '')会把lastName为NULL的情况替换成空字符串,然后用||拼接firstName和处理后的lastName,最后计算总长度。
方法二:分别处理长度后再求和
如果想分开计算两个字段的长度,记得用NVL()把NULL的长度转换成0,这样求和就不会变成NULL了:
LENGTH(p.firstName) + NVL(LENGTH(p.lastName), 0)
- 原理:
NVL(LENGTH(p.lastName), 0)会把lastName为NULL时的长度(也就是NULL)替换成0,再和firstName的长度相加,结果就正常了。
举个例子验证
假设:
- 当
p.firstName = 'John',p.lastName = 'Doe':两种方法都返回8(4+4) - 当
p.firstName = 'Jane',p.lastName = NULL:两种方法都返回4,不会出现NULL或者错误。
内容的提问来源于stack exchange,提问作者l. schwarz
相关产品推荐
相关产品推荐

