powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Коллеги, интересный запрос!
6 сообщений из 6, страница 1 из 1
Коллеги, интересный запрос!
    #39700617
LewaIowa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, добрый день!

Возникла интересная задачка:
необходимо расшифровать составное поле типа 000000000A, S00000000A

Привожу легенду:
Код: sql
1.
2.
3.
4.
5.
6.
7.
select 1 Num,'S' Code,'SAP' Description 
union all 
select 5,'F','Oracle'
union all 
select 10,'A','Axapta'
union all 
select 12,'S','SQL' 


, где
Num -- позиция,
Code -- значение,
Description -- требуемая расшифровка

Соответственно, результирующая табличка должна иметь следующий вид:

Код: plaintext
1.
2.
3.
4.
5.
6.
Num  Code  Description <поле, требующее расшифровки>
10	A      Axapta  000000000A
10	A      Axapta  S00000000A
1	S      SAP     S00000000A

000000000A -- 1 значение (A-10) => 1 строка 
S00000000A -- 2 значения (S-1 ; A-10) => 2 строки 

Как бы это половчее сделать средствами MSSQL?)

Модератор: Тема перенесена из форума "Работа".
...
Рейтинг: 0 / 0
Коллеги, интересный запрос!
    #39700635
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чём проблема-то? CTE-таблица наборов (буква-позиция-расшифровка), CROSS JOIN да проверка...
...
Рейтинг: 0 / 0
Коллеги, интересный запрос!
    #39700722
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
-- запрос работает только для расшифровываемых кодов длиной не более 12 символов, 
-- если надо больше добавьте значения в cteNumbers
with cteNumbers as (select * from (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12))t(Num)),
cteLeg (Num, Code, Description)
as (
              select 1, 'S','SAP' 
    union all select 5, 'F','Oracle'
    union all select 10,'A','Axapta'
    union all select 12,'S','SQL'
),
cteData (Val)
as (
              select '000000000A' 
    union all select 'S00000000A'
)
select sym.Num
     , leg.Code
     , leg.Description
     , d.Val
from cteData d
    -- создаем последовательность для каждого символа расшифровываемого кода
    cross apply (select * from cteNumbers n where n.Num <= len(d.Val)) sym 
    -- проверяем каждый символ расшифровываемого кода на совпадение в легенде
    cross apply (select * from cteLeg l where l.Num = sym.Num and l.Code = substring(d.Val, sym.Num, 1)) leg


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Num         Code Description Val
----------- ---- ----------- ----------
1           S    SAP         S00000000A
10          A    Axapta      000000000A
10          A    Axapta      S00000000A

(3 rows affected)
...
Рейтинг: 0 / 0
Коллеги, интересный запрос!
    #39700778
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Затуливетер
Код: sql
1.
2.
3.
-- запрос работает только для расшифровываемых кодов длиной не более 12 символов, 
-- если надо больше добавьте значения в cteNumbers
with cteNumbers as (select * from (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12))t(Num)),


зачем вообще нужен cteNumbers ?
Ведь в исх.данных уже есть позиция, на которой нужно проверять символ ...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with cteLeg (Num, Code, Description)
as (
              select 1, 'S','SAP' 
    union all select 5, 'F','Oracle'
    union all select 10,'A','Axapta'
    union all select 12,'S','SQL'
),
cteData (Val)
as (
              select '000000000A' 
    union all select 'S00000000A'
)

select
	a.Val
	,b.Code
	,b.Description
	,b.Num
from cteData a inner join cteLeg b on substring(a.Val, b.Num, 1) = b.Code
order by 1


ValCodeDescriptionNum000000000AAAxapta10S00000000ASSAP1S00000000AAAxapta10
...
Рейтинг: 0 / 0
Коллеги, интересный запрос!
    #39700802
LewaIowa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все гениальное на поверку оказывается чрезвычайно просто.
Коллеги, спасибо большое!
...
Рейтинг: 0 / 0
Коллеги, интересный запрос!
    #39700872
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court,

да точно
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Коллеги, интересный запрос!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]