在 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
我在 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