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

问题描述 投票:0回答:6

我见过其中一些问题,但没有发现有帮助的问题!我试图仅选择邮政编码的第一部分,基本上忽略空格后面的任何内容。我正在使用的代码是

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

但是,我得到:

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

没有空或空白,但有一些只有第一部分。这是导致错误的原因吗?如果是,解决方法是什么?

sql-server-2008
6个回答
61
投票

只有当

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

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

29
投票
如果字符串中没有空格,

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

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

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

11
投票

这是因为如果查找“ ”(空格)为 0,则 CHARINDEX-1 将返回 -ive 值。最简单的解决方案是通过添加 来避免 '-ve

'

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

即使

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


1
投票

所选列之一为空或为空。


0
投票

我知道这很旧,但它可能会对某人有所帮助。根据我的经验并尝试使用此处发布的一些解决方案,该解决方案可能是 NULL 导致错误。 就我而言,它不是 NULL,我得到了一个数字的结果,并且 CHARINDEX 不起作用。我做了什么 IIF 语句来检查结果是否为 1 位数字,我不按原样显示它们,然后对于超过 1 位数字或浮点数,这就是我使用 CHARINDEX 的地方,它起作用了。谢谢!

例如 IIF(len(TotalWorkExperience) = 1, TotalWorkExperience, left(TotalWorkExperience, charindex('.', TotalWorkExperience) - 1)) 作为 ExperienceYears,


-1
投票

您还可以使用的其他东西是

isnull

isnull( SUBSTRING(PostCode, 1 , CHARINDEX(' ', PostCode ) -1), PostCode)
© www.soinside.com 2019 - 2024. All rights reserved.