我有一个值,我需要在列名称中进行分解:AB: ABC-ABCDE
我需要中间部分ABC
。我使用SUBSTRING和CHARINDEX来完成此操作,但出现错误:
Msg 537, Level 16, State 2, Line 393
Invalid length parameter passed to the LEFT or SUBSTRING function.
当我减去CHARINDEX以得到SUBSTRING中的最后一个值时会发生这种情况。代码:
SELECT PRODUCT = (SUBSTRING(Name, CHARINDEX(' ',Name)+1,CHARINDEX('-',Name)-(CHARINDEX(' ',Name)+1)))
FROM A
我做错了什么?
UPDATE:表中有另一个值,如:'ABC-ABC: ABCDEFG-ABCDEF GH'
。这会产生负值,因此会产生错误。结果应为ABCDEFG
6条答案
按热度按时间6fe3ivhb1#
另一个选项是使用
NullIf()
“强制”NULL示例
**
编辑-请求的更新
**
退货
5m1hhzi42#
你没有空间了。我发现最简单的方法就是加一个:
我不能100%肯定这是你想要的,但它会修复你遇到的错误。
hfyxw5xn3#
你可以走另一条路:
--查询将从XML中挑选第二个元素。
诀窍在于:使用一些替换来转换 AB:ABC-ABCDE 转换为XML,如
从这个XML中,我们可以很容易地选择第二个元素。
一个积极的副作用:这种方法更能容忍错误的值......
更新
你的错误值......新的技巧是使用
STUFF()
删除所有的东西,直到双点:b09cbbtk4#
您的问题无法重现。
结果以
ABC
表示。您的表中可能有一些数据不符合您声称的格式。
iklwldmw5#
有时候会有你意想不到的地方。
因此,获取从
":"
到"-"
的子字符串,并对其进行修剪:n3ipq98p6#
val1和val2中的值当我实际减去它们时,它们给予我一个与运算一致的数值。
如果运行相同的代码但不进行强制转换,则不会产生相同的值:
我宁愿看到SQL有一个
INSTR
或GetStr
函数,它将返回一个匹配的字符串,如果不存在,则返回NULL
。