我在SUBSTRING中有CHARINDEX函数,它必须识别分隔符(|)并将值作为参数返回到子字符串
当分隔符存在时,它可以正常工作
{{1}}
其中ID为SH1684
当它不存在时
这会导致错误
消息536,级别16,状态1,行1传递给的长度参数无效 子串函数。
但我的目的是获得身份证号码SH168432I5。
我如何规避这个问题。
答案 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