SQL charindex throwing Недопустимый параметр длины, переданный в функцию LEFT или SUBSTRING из-за точки?
У меня есть строки ниже в предложении where моего запроса, но я продолжаю получать эту ошибку:
Msg 537, Level 16, State 3, Line 3
Invalid length parameter passed to the LEFT or SUBSTRING function.
SUBSTRING(
[email],
1,
CHARINDEX('@',[email])-1
) =
SUBSTRING(
[email],
CHARINDEX('@',[email])+1,
CHARINDEX('.', [email])
)
Ошибка происходит из CHARINDEX('.', [email])
Если я изменю период на букву, я не получу ошибку. В каждой записи есть точка, и даже если ее нет, функция charindex вернет 0, что не приведет к выдаче этой ошибки. Я должен пропустить что-то простое. Пожалуйста помоги!
РЕДАКТИРОВАТЬ.
Я пытался бросить его внутрь, isnull(CHARINDEX('.', [email]), 1)
на всякий случай, по какой-то причине он возвращал ноль, но это тоже не сработало.
2 ответа
Ошибка происходит из
CHARINDEX('@',[email])-1
Если в данных нет символа @, charindex возвращает 0. Вы вычитаете один из них, чтобы получить -1, что недопустимо в функции подстроки.
Попробуйте это вместо этого.
CHARINDEX('@',[email] + '@')-1
Это приводит к совпадению, гарантируя, что CharIndex всегда будет возвращать значение>= 1, что приведет к успешному выполнению функции подстроки.
Я не уверен, что это твоя единственная проблема. Я предполагаю, что вы пытаетесь просмотреть первую часть адреса электронной почты и сравнить ее с первой частью домена. Например, если адрес электронной почты "name@company.com", то вы ищете "имя" и "компания". Подстрока не занимает 2 позиции, она занимает позицию и длину. Поэтому, чтобы получить "компанию", вам нужно сделать это:
SUBSTRING(
[email],
CHARINDEX('@', [email]) + 1,
CHARINDEX('.', [email]) - CHARINDEX('@', [email]) - 1
)
+1 и -1 должны учитывать тот факт, что CHARINDEX даст вам позицию "@", поэтому он будет включать "@" в результате.
К сожалению, это не всегда будет работать, потому что если у вас есть адрес, например "first.last@company.com", то позиция первого "." будет меньше позиции "@", что приведет к отрицательному числу.
Поэтому вам нужно будет сделать это:
SUBSTRING(
[email],
CHARINDEX('@', [email]) + 1,
CHARINDEX('.', [email], CHARINDEX('@', [email])) - CHARINDEX('@', [email]) - 1
)
Это позволит убедиться, что вы ищете первый "." после "@". Тем не менее, это по-прежнему не работает, если у вас нет "@", но у вас есть "." (например, "invalididemail.companay.com"). Для этого вы могли бы сделать решение выше, чтобы добавить '@' в конце, но лучший способ будет выглядеть так:
SUBSTRING(
[email],
CHARINDEX('@', [email]) + 1,
CASE WHEN
CHARINDEX('.', [email], CHARINDEX('@', [email])) - CHARINDEX('@', [email]) - 1 < 0
THEN 0
ELSE
CHARINDEX('.', [email], CHARINDEX('@', [email])) - CHARINDEX('@', [email]) - 1
END
)
Вы можете просто добавить ' ' в конце строки с ошибкой, например
SUBSTRING(
[email],
1,
CHARINDEX('@',[email]+' ')-1
) =
SUBSTRING(
[email],
CHARINDEX('@',[email])+1,
CHARINDEX('.', [email])
)