2013-12-06 3 views
2

У меня есть таблица ниже в моем MSSQL.Операция обновления с подстрокой в ​​MSSQL

itemNo  itemDesc     ComponentType Voltage 
100001LF CAP CER 10n 25V 20% 0805 CAPACITOR NULL 
100002LF CAP CER 10n 50V 20% 1206 CAPACITOR NULL 
100008LF CAP CER 100n 25V 20% 0805 CAPACITOR NULL 
100012LF CAP CERAM 1n 25V 20% 0805 CAPACITOR NULL 
100013LF CAP CER 100n 25V 20% 0805 CAPACITOR NULL 

Теперь, как определить напряжение от itemDesc и поставить его к Voltage?

Примечание: Напряжение можно определить следующим образом: Искать букву V, принять все символы перед тем, как вы увидите пробелы.

Моя первая попытка заключается в следующем: [Но, не получилось :(]

UPDATE dbo.capacitor 

SET [Voltage] = CASE WHEN CHARINDEX('% ', ItemDesc) > 0 THEN SUBSTRING(itemDesc, CHARINDEX['V ', ItemDesc], CHARINDEX['V ',ItemDesc]+2) 
         ELSE null 
END 

(Я использую C# для материала кодирования Но я хочу эту операцию можно сделать с помощью в SQL. Сам сервер вместо того, чтобы использовать C# для записи каждой записи, обработать и вернуть ее обратно).

+0

Что произойдет, если часть '' CAP CER '' свяжется с '' V''? Или вы можете гарантировать ***, что это невозможно? Или возможны другие поиски? Например, «третий из последнего элемента в списке, разделенном пробелом»? – MatBailie

+0

@MatBailie: Я могу гарантировать, что это никогда не произойдет, потому что именно я беру на себя ответственность за помещение данных. Таким образом, он всегда «следует стандартной схеме». :) –

+0

У меня нет времени, чтобы дать вам решение, но вот мой намек ... После того, как вы нашли первый '' V'', возьмите все до этого '' V'' и измените строку. Теперь найдите все до первого '' '', и вы найдете напряжение, назад, так что просто верните его снова. – MatBailie

ответ

1
UPDATE dbo.capacitor 
SET [Voltage] = CASE WHEN CHARINDEX('% ', itemDesc) > 0 THEN SUBSTRING(itemDesc, CHARINDEX('n', itemDesc) + 1, CHARINDEX('V ',itemDesc) - (CHARINDEX('n', itemDesc) + 1)) 
ELSE null END 
END 
+0

классный способ. Нравится это :) –

+1

@nowhewhustyNotbenamed. Емкость не всегда заканчивается «n», по крайней мере, один показывает «p». – MatBailie

+1

@MatBailie: приятно поймать. Но это опечатка. Он всегда заканчивается на «n». Исправлено в вопросе :) –

3

Я думаю, это было бы намного проще в C#, но вот решение, которое будет работать в SQL. Оно меняет строку и ищет V после пространство и занимает все до следующего места, а затем возвращает его обратно.

declare @desc as varchar(100) = 'CAP CER 10n 25V 20% 0805' 

select REVERSE(SUBSTRING(REVERSE(@desc), 
    charindex(' V', REVERSE(@desc)) + 2, 
    CHARINDEX(' ', REVERSE(@desc), charindex(' V', REVERSE(@desc)) + 1) - charindex(' V', REVERSE(@desc)) - 2)) 
+0

Он работает как шарм. Но для меня все направления автоматически берут каждый столбец' itemDesc', обрабатывают эту логику и нажимают на 'value' column? Что я должен использовать?' Хранимые процедуры'? –

+0

Вы можете использовать хранимый процесс, но если это одно, вы можете просто запустить его. Синтаксис будет выглядеть как «update capacitor set value = <выше запрос на столбец itemDesc> ' – Szymon

+1

Спасибо за указатель. Будет определенно использовать эту идею. –

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