SQL charindex throw由于周期而传递给LEFT或SUBSTRING函数的无效长度参数?

Ant*_*y L 10 sql t-sql

我在查询的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])
    )
Run Code Online (Sandbox Code Playgroud)

错误源于 CHARINDEX('.', [email])

如果我将句号更改为字母,我不会收到错误.每个记录都有一个句点,即使没有记录,charindex函数也会返回0,这不会导致抛出此错误.我一定很遗憾.请帮忙!

编辑.

我试着把它扔进一个isnull, isnull(CHARINDEX('.', [email]), 1)以防万一它由于某种原因返回null,但这也没有用.

G M*_*ros 22

错误源于

CHARINDEX('@',[email])-1
Run Code Online (Sandbox Code Playgroud)

如果数据中没有@符号,则charindex返回0.从中减去1得到-1,这在子字符串函数中无效.

试试这个.

CHARINDEX('@',[email] + '@')-1
Run Code Online (Sandbox Code Playgroud)

这会强制匹配,确保CharIndex将始终返回值> = 1,这将导致子字符串函数成功.