Sql server 在子字符串中使用Charindex会导致错误

Sql server 在子字符串中使用Charindex会导致错误,sql-server,substring,charindex,Sql Server,Substring,Charindex,我有一个带有in子字符串的CHARINDEX函数,它必须标识分隔符(|)值并将该值作为参数返回给子字符串 当存在分隔符时,它可以正常工作 select SUBSTRING('SH1684|32I5', 1, CHARINDEX('|', 'SH1684|32I5') -1) AS ID 其中ID为SH1684 当它不存在时 这会导致如下错误: 消息536,级别16,状态1,第1行传递给的长度参数无效 子字符串函数 但我的目的是获取ID中的值,即SH168432I5 如何避免此问题。尝试此方法,

我有一个带有in子字符串的CHARINDEX函数,它必须标识分隔符(|)值并将该值作为参数返回给子字符串

当存在分隔符时,它可以正常工作

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

当它不存在时

这会导致如下错误:

消息536,级别16,状态1,第1行传递给的长度参数无效 子字符串函数

但我的目的是获取ID中的值,即SH168432I5


如何避免此问题。

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

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

请尝试此操作,通过添加分隔符,可以确保在缺少分隔符的情况下,它处于正确的逻辑位置:

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

只需使用
CASE
语句确定
|
是否存在
CHARINDEX
将返回
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

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

只需使用
CASE
语句来确定
是否存在
CHARINDEX
将返回
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
因此,如果存在,它将返回
|
之前的部分,否则它将返回整个值。

请使用select REPLACE('SH1684 | 32I5','|','')。这一定行得通。

请使用选择替换('SH1684 | 32I5','|','')。这一定行得通。