36

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

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

但是,我将无效的长度参数传递给 LEFT 或 SUBSTRING 函数!没有空值或空白,但有一些只有第一部分。这是导致错误的原因吗?如果是,解决方法是什么?

4

5 回答 5

49

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

select SUBSTRING(PostCode, 1 ,
case when  CHARINDEX(' ', PostCode ) = 0 then LEN(PostCode) 
else CHARINDEX(' ', PostCode) -1 end)
于 2013-06-28T15:19:31.020 回答
27

CHARINDEX如果字符串中没有空格,将返回0,然后您查找-1长度的子字符串。

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

SELECT SUBSTRING(PostCode, 1 , CHARINDEX(' ', PostCode + ' ' ) -1)
于 2013-06-28T15:21:34.323 回答
9

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

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

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

于 2015-01-12T14:37:08.740 回答
0

所选列之一为空或空。

于 2021-12-07T09:03:41.837 回答
-1

您可以使用的其他内容是isnull

isnull( SUBSTRING(PostCode, 1 , CHARINDEX(' ', PostCode ) -1), PostCode)
于 2021-02-23T17:02:11.093 回答