Неверный параметр длины передается функции 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. Поправьте меня если я ошибаюсь!