Sql server 在子字符串中使用Charindex会导致错误
我有一个带有in子字符串的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 如何避免此问题。尝试此方法,
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','|','')。这一定行得通。