Неверный параметр длины передается функции LEFT или SUBSTRING

Я видел несколько из этих вопросов, но не заметил того, что помогло! Я пытаюсь выбрать первую часть почтового индекса, по существу игнорируя что-либо после пробела. код, который я использую,

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

однако я получаю параметр Invalid length, переданный функции LEFT или SUBSTRING! Там нет нулей или пробелов, но есть некоторые, у которых есть только первая часть. это то, что вызывает ошибку, и если да, то что работает?!

Ответ 1

Это произойдет только в том случае, если PostCode не хватает места. Вы можете добавить условность, чтобы весь PostCode был извлечен, если пробел не был найден следующим образом

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

Ответ 2

CHARINDEX вернет 0 если в строке нет пробелов, а затем вы ищете подстроку длины -1.

Вы можете привязать конечное пространство к концу строки, чтобы обеспечить всегда хотя бы одно пространство и избежать этой проблемы.

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

Ответ 3

Это связано с тем, что CHARINDEX -1 возвращает значение -ive, если поиск "" (пробел) равен 0. Простейшим решением было бы избежать "-ve " путем добавления

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

который будет возвращать только значения +ive для вашей длины, даже если CHARINDEX(' ', PostCode ) -1) является значением -ve. Поправьте меня если я ошибаюсь!