传递给LEFT或SUBSTRING函数的长度参数无效

时间:2013-06-28 15:14:45

标签: sql-server-2008

我已经看过其中一些问题,但没有发现一个有帮助的问题!我只想选择邮政编码的第一部分,基本上忽略了空格后的任何内容。我正在使用的代码是

SUBSTRING(PostCode, 1 , CHARINDEX(' ', PostCode ) -1)

但是我得到传递给LEFT或SUBSTRING函数的无效长度参数!没有空值或空白但有一些只有第一部分。这是导致错误的原因,如果是这样的话,是什么工作?!

4 个答案:

答案 0 :(得分:29)

只有在PostCode缺少空格时才会发生这种情况。 您可以添加条件,以便在找不到如下空格时检索所有PostCode

select SUBSTRING(PostCode, 1 ,
case when  CHARINDEX(' ', PostCode ) = 0 then LEN(PostCode) 
else CHARINDEX(' ', PostCode) -1 end)

答案 1 :(得分:15)

如果字符串中没有空格,则

CHARINDEX将返回0,然后您会查找-1长度的子字符串。

您可以在字符串末尾添加尾随空格,以确保始终至少有一个空格并避免此问题。

SELECT SUBSTRING(PostCode, 1 , CHARINDEX(' ', PostCode + ' ' ) -1)

答案 2 :(得分:7)

这是因为 CHARINDEX-1 在查找"时会返回-ive值。 " (空格)是0.最简单的解决方案是避免' -ve '通过添加

ABS(CHARINDEX(' ', PostCode ) -1))

即使CHARINDEX(' ', PostCode ) -1)是-ve值,也只返回长度的+ ive值。如果我错了,请纠正我!

答案 3 :(得分:0)

您还可以使用isnull

isnull( SUBSTRING(PostCode, 1 , CHARINDEX(' ', PostCode ) -1), PostCode)