Использование Charindex с подстрокой приводит к ошибке

У меня есть функция CHARINDEX с SUBSTRING, которая должна идентифицировать значение разделителя (|) и возвращать значение в качестве параметра в подстроку.

Когда разделитель присутствует, он отлично работает

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

где идентификатор SH1684

Когда его нет

Это приводит к ошибке, поскольку

Сообщение 536, уровень 16, состояние 1, строка 1 Неверный параметр длины передан в функцию подстроки.

Но я намерен получить значение ID как SH168432I5.

Как мне обойти эту проблему.


person Sree    schedule 08.06.2015    source источник


Ответы (3)


Вместо этого попробуйте это, добавив разделитель, чтобы убедиться, что он находится в правильной логической позиции в тех случаях, когда он отсутствует:

SELECT LEFT('SH1684|32I5', CHARINDEX('|', 'SH1684|32I5' + '|') - 1)
person t-clausen.dk    schedule 08.06.2015

Просто используйте оператор 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

Таким образом, он вернет часть до |, если он присутствует, в противном случае он вернет все значение.

person Tanner    schedule 08.06.2015

пожалуйста, используйте select REPLACE('SH1684|32I5', '|', '') . Это должно работать. Пример функции замены

person Aniruddha Mukherjee    schedule 18.10.2018