Я вижу, что это решается в два логических шага:
Разбить каждый список диапазонов префиксов на ряд рядов префиксов, то есть каждую строку, например
city
operator
prefix-range1 prefix-range2 prefix-range3 …
разбивается на
city
operator
prefix-range1
city
operator
prefix-range2
city
operator
prefix-range3
city
…
Развернуть каждый элемент диапазона префиксов, например
city
operator
<em>Prefix<sub>1</sub>-Prefix<sub>N</sub></em>
впоследовательность строк, подобная этой:
city
operator
<em>Prefix<sub>1</sub></em>
city
operator
<em>Prefix<sub>2</sub></em>
city
operator
<em>…</em>
city
operator
<em>Prefix<sub>N-1</sub></em>
city
operator
<em>Prefix<sub>N</sub></em>
Ниже приведена попытка реализации указанногологика:
WITH data (Cityname, operatorname, prefix) AS ( /* this is just a sample data definition */
SELECT 'Kolkata', 'Unitech ', '90620-90629 82960-82969' UNION ALL
SELECT 'Kolkata', 'Datacom ', '90730-90739' UNION ALL
SELECT 'Kolkata', 'BSNL ', '94330-94339 94320-94325' UNION ALL
SELECT 'Kolkata', 'Loop ', '91100-91109' UNION ALL
SELECT 'Kolkata', 'Reliance Telecom', '98830-98839 96810-96819 88200-88209' UNION ALL
SELECT 'Mumbai ', 'BPL Mobile ', '98210-98219 96640-96649 97730-97739 98700-98709 80820-80829' UNION ALL
SELECT 'Mumbai ', 'Bharti Airtel ', '98670-98679 98920-98929 99670-99674 99870-99878 90040-90049'
),
SplitGroups AS ( /* this is where the list is split into separate ranges */
SELECT
d.Cityname, d.operatorname,
StartPrefix = CAST(LEFT (x.PrefixGroup, 5) AS int),
EndPrefix = CAST(RIGHT(x.PrefixGroup, 5) AS int)
FROM (
SELECT
Cityname, operatorname,
prefixlist = CAST('<i>'+REPLACE(prefix, ' ', '</i><i>')+'</i>' AS xml)
FROM data
) d
CROSS APPLY (
SELECT
i.value('.', 'varchar(max)') AS PrefixGroup
FROM d.prefixlist.nodes('i') x (i)
) x
)
SELECT /* the final SELECT expands the ranges into single prefix rows */
g.Cityname, g.operatorname,
prefix = g.StartPrefix + v.number
FROM SplitGroups g
INNER JOIN master..spt_values v on v.type = 'P'
AND v.number BETWEEN 0 AND g.EndPrefix - g.StartPrefix
Он работает в моем SQL Server 2008 R2, как и ожидалось, но были сделаны следующие предположения:
Все исходные значения prefix
отформатированы единообразно и согласованно:
диапазоны разделены одним пробелом;
нет пробелов, кроме тех, которые разделяют диапазоны;
каждый диапазон представляет собой целое число, за которым следует дефис (-
), за которым следует целое число.
Каждое целое число (префикс)содержит ровно 5 цифр.
Каждый диапазон охватывает не более 2048 префиксов, то есть разница между конечным префиксом и начальным префиксом никогда не превышает 2047. Это ограничение master..spt_values
Таблица.Вы можете заменить его своей собственной таблицей номеров, если вам нужна поддержка для более чем 2048 префиксов в диапазоне.
Ссылки: