Работа со строками в SQL

maximovega

Подскажите, пожалуйста, есть ли "творческий" способ решения, более короткий и не очень загружающий сервер?
Изначально был запрос величин a, b, c и кода вида C1 или C2, который находился после знака подчёркивания в длинной строчке, более того, после подчёркивания мог идти только такой подкод. Эти два символа занимали либо пятую и шестую, либо шестую и седьмую, либо седьмую и восьмую позицию. Вхождение кода единственно. Строки были, например, таковы:
100_C1_/DF, 100V_C2RTE, 300IO_C1PPP
Соответственно, запрос был следующим:
SELECT a, b, c,
CASE WHEN Right(Left(Q,41) = '_' THEN Right(Left(Q,62) ELSE
CASE WHEN Right(Left(Q,51) = '_' THEN Right(Left(Q,72) ELSE
Right(Left(Q,82)
END
END AS NAME
Теперь подкод может находиться на любом месте (хотя, опять же, после знака подчёркивания). Строки таковы:
100_C1_/DF, 100V_C2RTE, 300IO_C1PPP, EFG/_SD__C1SDLK, SDLJK_CKH_000_C1
Пишу запрос
CASE WHEN Right(Left(Q,41) = '_' THEN
CASE WHEN Right(Left(Q,62) IN ('C1','C2') THEN Right(Left(Q,62) ELSE
CASE WHEN Right(Left(Q,51) = '_' THEN
CASE WHEN Right(Left(Q,72) IN ('C1','C2') THEN Right(Left(Q,72) ELSE
CASE WHEN Right(Left(Q,61)...
Но это совершенно неразумно, пусть я знаю, что подкод будет максимально начинаться на двадцатой позиции. И перегружает сервер.
У меня опыт очень маленький - и решение найти пока не получается. Подскажите, пожалуйста, как можно подправить это красивее?

Dasar

база какая? ms sql, oracle, mysql?

hprt

select substring(Q, charindex('_C', Q) + 1, 2)

hprt

mssql, уже выясняли :)

Dasar

c точки зрения скорости - выделение кода стоит оформить как вычислимую колонку, материализовать ее и построить по ней индекс.
тогда скорость работы самой функции будет намного менее важной

mbolik1

если код всегда имеет длину 2 символа и всегда имеет вид C[0-9] и всегда присутствует в строке, то
 substring(patindex('%[_]C[0-9]%',Q)+1,Q) 

upd. Поправил по замечаниям .

hprt

только PATINDEX. А так да, я немного неправильно написал, да и подчеркивание надо в скобки :)

maximovega

Большое всем спасибо, очень красивое решение! :)
У меня осталось уточнение:
1. Почему сам символ С не требует квадратных скобок, тогда как всё остальное в них?
2. Как компилятор распознаёт, что запись [0-9] означает именно цифру от 0 до 9, и что если мне нужно будет расширить, например, не до 9, а до 15? Достаточно будет написать [0-15]? :o

mbolik1

1. Тут от противного: "_" в квадратных скобках потому что это спецсимовл. 0-9 в квадратных скобках потому что это диапазон. А "С" — просто буква, её можно и без квадратных скобок
2. Нет [0-9] это 1 любой символ между 0 и 9, если у тебя два числа, то это уже два символа скажем [0-9][0-9], но моё решение предполагает что код всегда из 2-х символов, если он может быть переменной длинны, то нужно более сложное решение.
Оставить комментарий
Имя или ник:
Комментарий: