Ongeldige parameter in de lengte doorgegeven aan de linker- of substringfunctie

Ik heb een paar van deze vragen gezien, maar hebben er geen gespot die geholpen is !! Ik probeer het eerste deel van een postcode alleen te selecteren, in wezen iets negeert na de ruimte. De code die ik gebruik is

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

Ik krijg echter een ongeldige lengteparameter doorgegeven aan de linker- of substringfunctie! Er zijn geen nulls of blanco’s, maar er zijn wat het enige heeft het eerste deel. Is dit wat de fout veroorzaakt en zo ja, wat is het werk?


Antwoord 1, Autoriteit 100%

Dat zou alleen gebeuren als PostCodeeen spatie missen.
U kunt bijvoorbeeld conditionaliteit toevoegen dat alle PostCodewordt opgehaald als een ruimte niet als volgt te vinden is

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

Antwoord 2, Autoriteit 56%

CHARINDEXretourneert 0als er geen spaties in de tekenreeks staan ​​en dan zoek u naar een substring van -1lengte.

U kunt een trailingruimte aan het einde van de tekenreeks aanpakken om ervoor te zorgen dat er altijd ten minste één ruimte is en dit probleem vermijdt.

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

Antwoord 3, Autoriteit 18%

Dit komt omdat de Charindex-1 een -i-waarde retourneert als de opzoeking voor “” (ruimte) is 0. De eenvoudigste oplossing zou zijn om ‘- ve te voorkomen ‘door

toe te voegen

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

die alleen +ive waarden voor uw lengte retourneert, zelfs als CHARINDEX(' ', PostCode ) -1)een -ve waarde is. Corrigeer me als ik het mis heb!


Antwoord 4

Iets anders dat u kunt gebruiken is isnull:

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

Other episodes