我见过其中一些问题,但没有发现有帮助的问题!我试图仅选择邮政编码的第一部分,基本上忽略空格后面的任何内容。我正在使用的代码是
SUBSTRING(PostCode, 1 , CHARINDEX(' ', PostCode ) -1)
但是,我得到:
传递给 LEFT 或 SUBSTRING 函数的长度参数无效
没有空或空白,但有一些只有第一部分。这是导致错误的原因吗?如果是,解决方法是什么?
只有当
PostCode
缺少空格时才会发生这种情况。
您可以添加条件,以便在找不到空格时检索所有 PostCode
,如下所示
select SUBSTRING(PostCode, 1 ,
case when CHARINDEX(' ', PostCode ) = 0 then LEN(PostCode)
else CHARINDEX(' ', PostCode) -1 end)
CHARINDEX
将返回 0
,然后查找长度为 -1
的子字符串。
您可以在字符串末尾添加一个尾随空格,以确保始终至少有一个空格并避免此问题。
SELECT SUBSTRING(PostCode, 1 , CHARINDEX(' ', PostCode + ' ' ) -1)
这是因为如果查找“ ”(空格)为 0,则 CHARINDEX-1 将返回 -ive 值。最简单的解决方案是通过添加 来避免 '-ve
'ABS(CHARINDEX(' ', PostCode ) -1))
即使
CHARINDEX(' ', PostCode ) -1)
是 -ve 值,也只会返回长度的 +ive 值。如果我错了请纠正我!
所选列之一为空或为空。
我知道这很旧,但它可能会对某人有所帮助。根据我的经验并尝试使用此处发布的一些解决方案,该解决方案可能是 NULL 导致错误。 就我而言,它不是 NULL,我得到了一个数字的结果,并且 CHARINDEX 不起作用。我做了什么 IIF 语句来检查结果是否为 1 位数字,我不按原样显示它们,然后对于超过 1 位数字或浮点数,这就是我使用 CHARINDEX 的地方,它起作用了。谢谢!
例如 IIF(len(TotalWorkExperience) = 1, TotalWorkExperience, left(TotalWorkExperience, charindex('.', TotalWorkExperience) - 1)) 作为 ExperienceYears,
您还可以使用的其他东西是
isnull
:
isnull( SUBSTRING(PostCode, 1 , CHARINDEX(' ', PostCode ) -1), PostCode)