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

时间:2015-06-08 12:54:11

标签: sql-server substring charindex

我在SUBSTRING中有CHARINDEX函数,它必须识别分隔符(|)并将值作为参数返回到子字符串

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

{{1}}

其中ID为SH1684

当它不存在时

这会导致错误

  

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

但我的目的是获得身份证号码SH168432I5。

我如何规避这个问题。

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

只需使用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

|

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

答案 2 :(得分:0)

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