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])
)
Другие вопросы по тегам