2015-04-09 3 views
0

У меня есть записи следующим образом:Возврат записи на основании результата функции

1) BEL
1) Mersen
А) VISHAY-SPRAGUE
ЦЕПЬ ПАРТНЕРЫ
BENTEK
ЦЕПЬ ТЕСТ

Я хочу вернуть отдельный набор, если в записи есть закрывающая скобка, а затем удалить весь префикс скобки (1) MERSEN становится MERSEN), в противном случае вернуть запись как есть. Это специальный, один запрос. Я пробовал что-то вроде этого.

IF (CHARINDEX(')', (SELECT [MANUFACTURER] FROM [dbo].[QPL_ITMSUPAC_NF]), 1) > 0) 

    SELECT DISTINCT SUBSTRING([dbo].[QPL_ITMSUPAC_NF].[MANUFACTURER], 4, 99) 
    FROM [dbo].[QPL_ITMSUPAC_NF] 

ELSE 

    SELECT DISTINCT [dbo].[QPL_ITMSUPAC_NF].[MANUFACTURER] 
    FROM [dbo].[QPL_ITMSUPAC_NF] 

... но получаю ошибку:

Subquery returned more than 1 value...

выше была в порядке.

Мысли?

ответ

1

Используйте exists и переместите функцию в подзапрос. В этом случае charindex() эквивалентно like ')%':

IF (EXISTS (SELECT 1 FROM [dbo].[QPL_ITMSUPAC_NF] WHERE MANUFACTURER LIKE ')%')) 
    SELECT DISTINCT SUBSTRING([dbo].[QPL_ITMSUPAC_NF].[MANUFACTURER], 4, 99) 
    FROM [dbo].[QPL_ITMSUPAC_NF] 
ELSE 
    SELECT DISTINCT [dbo].[QPL_ITMSUPAC_NF].[MANUFACTURER] 
    FROM [dbo].[QPL_ITMSUPAC_NF] 
0

ваш подзапрос SELECT [MANUFACTURER] FROM [dbo].[QPL_ITMSUPAC_NF] возвращается более чем на 1 значение (таблица), но функция CHARINDEX() ожидает только 1 значение.

1

Вы можете сделать это с помощью right функции с приемом помощи от len и charindex функции:

select right(MANUFACTURER,len(MANUFACTURER)-charindex(')',MANUFACTURER)) 
from QPL_ITMSUPAC_NF 

Пример:

select right('1)a sample name',len('1)a sample name')-charindex(')','1)a sample name')) 

Выход:

a sample name 
+0

Ошибка преобразования при преобразовании значения varchar '1) ANALOG DEVICES' в тип данных int. – CarloC

+0

Мне очень жаль, что опечатка, попробуйте еще раз – jfun

0
SELECT DISTINCT LTRIM(RIGHT(MANUFACTURER,LEN(MANUFACTURER) - CHARINDEX(')',MANUFACTURER))) 
FROM QPL_ITMSUPAC_NF 

... вернулся 2552 записей

IF (EXISTS (SELECT 1 FROM [dbo].[QPL_ITMSUPAC_NF] WHERE MANUFACTURER LIKE ')%')) 
SELECT DISTINCT LTRIM(SUBSTRING([dbo].[QPL_ITMSUPAC_NF].[MANUFACTURER], CHARINDEX(')', [MANUFACTURER], 1) + 1, 99)) 
FROM [dbo].[QPL_ITMSUPAC_NF] 
ELSE 
SELECT DISTINCT [dbo].[QPL_ITMSUPAC_NF].[MANUFACTURER] 
FROM [dbo].[QPL_ITMSUPAC_NF] 

... вернулся 2495 записей.

достаточно близко для моих нужд, спасибо.

Смежные вопросы