在 Substring 中使用 Charindex 会导致错误

Using Charindex with in Substring is resulting in error

我在 SUBSTRING 中有 CHARINDEX 函数,它必须识别分隔符 (|) 值和 return 该值作为子字符串的参数

当存在定界符时它工作正常

select SUBSTRING('SH1684|32I5', 1, CHARINDEX('|', 'SH1684|32I5') -1) AS ID

其中ID为SH1684

不存在时

这会导致错误,因为

Msg 536, Level 16, State 1, Line 1 Invalid length parameter passed to the substring function.

但我的目的是获取 ID 中的值 SH168432I5。

如何避免这个问题。

试试这个,通过添加分隔符,您可以确保它在缺少分隔符的情况下处于正确的逻辑位置:

SELECT LEFT('SH1684|32I5', CHARINDEX('|', 'SH1684|32I5' + '|') - 1)

只需使用 CASE 语句来确定 | 是否存在。 CHARINDEX 将 return 0 如果不存在:

DECLARE @val VARCHAR(15) = 'SH1684|32I5'

-- show the value
SELECT @val

-- returns the section before the pipe
SELECT  CASE WHEN CHARINDEX('|', @val) > 0
             THEN SUBSTRING('SH1684|32I5', 1,
                            CHARINDEX('|', 'SH1684|32I5') - 1)
             ELSE @val
        END AS ID

-- set value without pipe
SET @val = 'SH168432I5'
-- same query returns entire value as there is no pipe
SELECT  CASE WHEN CHARINDEX('|', @val) > 0
             THEN SUBSTRING('SH1684|32I5', 1,
                            CHARINDEX('|', 'SH1684|32I5') - 1)
             ELSE @val
        END AS ID

因此它将 return | 之前的部分(如果存在),否则它将 return 整个值。

请使用 select REPLACE('SH1684|32I5', '|', '') 。这必须工作。 Replace Function Example