Разбиваем строку в SQL-запрос


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

Select 
       substring(pc.BudgetCode,1, CHARINDEX('-',pc.BudgetCode)-1) as Cost_Center,
       substring(Substring(pc.BudgetCode,Charindex('-',pc.BudgetCode)+1,len(pc.BudgetCode)),1, CHARINDEX('-',Substring(pc.BudgetCode,Charindex('-',pc.BudgetCode)+1,len(pc.BudgetCode)))-1) as Account_Code,
       Substring(Substring(pc.BudgetCode,Charindex('-',pc.BudgetCode)+1,len(pc.BudgetCode)),Charindex('-',Substring(pc.BudgetCode,Charindex('-',pc.BudgetCode)+1,len(pc.BudgetCode)))+1,len(Substring(pc.BudgetCode,Charindex('-',pc.BudgetCode)+1,len(pc.BudgetCode)))) as Slid_Code
from pc


14357
3
задан 1 сентября 2011 в 04:09 Источник Поделиться
Комментарии
2 ответа

Хм... не знаю, насколько быстрее это будет, но это может быть проще, чтобы обернуть вокруг головы.
Вы можете использовать рекурсивный CTE-выражения:

WITH Splitter (id, start, e, section, original, num) as (
SELECT id, 1, CHARINDEX('-', budgetCode), CAST('' AS VARCHAR(20)), budgetCode, 0
FROM PC
UNION ALL
SELECT id, e + 1,
CASE WHEN CHARINDEX('-', original, e + 1) > 0
THEN CHARINDEX('-', original, e + 1)
ELSE LEN(original) + 1 END,
SUBSTRING(original, start, e - start),
original, num + 1
FROM Splitter
WHERE e > start)

Результаты:

SELECT * 
FROM splitter

Делает таблицу, которая выглядит так:

Id  BudgetCode
=====================
1 xxxx-yyyyy-zzzzz

В этом:

Id  Start  End   Section   Original           Num
1 1 5 xxxx-yyyyy-zzzzz 0
1 6 11 xxxx xxxx-yyyyy-zzzzz 1
1 12 17 yyyyy xxxx-yyyyy-zzzzz 2
1 18 17 zzzzz xxxx-yyyyy-zzzzz 3

Пример SQL скрипку

Вы можете тогда присоединиться к результирующему набору несколько раз на основе Нум или что-то, чтобы получить конкретный индекс вам нужен. Он будет автоматически обрабатывать любые дополнительные подполя' (до предела рекурсии, конечно).

4
ответ дан 1 сентября 2011 в 10:09 Источник Поделиться

Во-первых, если у вас есть какое-либо влияние на все структуры базы данных, вы можете сделать лучше, сохраняя струны отдельно. Это намного проще, чтобы склеить строки вместе, когда это необходимо, чем разделить их друг от друга при необходимости.

Во-вторых, если вы всегда гарантированно имеют одинаковое количество цифр в каждой из Бюджетного кодекса, вы могли бы просто использовать абсолютный характер позиции, такие как подстрока(ПК.BudgetCode,6,5)

Смотри этот похож, так что вопрос и в этом более общем такой вопрос, какие ссылки
этот авторитетный странице множество способов разделения строк, многие из которых кажутся излишне сложным для вашей цели.

Вы можете также попробовать писать очень простые функции. Одним из преимуществ является то, что в MSSQL, кажется, кэширование результатов функции, поэтому запрос функции могут работать намного быстрее во второй раз:

create function getslidcode (@budgetcode nvarchar(100))
returns @slidcode nvarchar(100) as
begin
declare @pos int
select @pos = charindex('-', @budgetcode)
select @pos = charindex('-', @budgetcode, @pos + 1)
select @slidcode = substring(@budgetcode, @pos + 1, 100)
end

select budgetcode, getslidcode(budgetcode) as slidcode from pc

3
ответ дан 4 сентября 2011 в 02:09 Источник Поделиться