1

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

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

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

其中 ID 为 SH1684

当它不存在时

这导致错误为

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

但我的意图是在 ID 中获得价值为 SH168432I5。

我该如何规避这个问题。

4

3 回答 3

5

试试这个,通过添加分隔符,您可以确保它在丢失的情况下处于正确的逻辑位置:

SELECT LEFT('SH1684|32I5', CHARINDEX('|', 'SH1684|32I5' + '|') - 1)
于 2015-06-08T13:00:29.567 回答
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

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

于 2015-06-08T13:01:01.967 回答
0

请使用 select REPLACE('SH1684|32I5', '|', '') 。这必须有效。 替换函数示例

于 2018-10-18T04:17:24.113 回答