ahmed_sa Ответов: 1

Не удается обновить статус для соответствия символам в случае, если значение ключа подписи равно звездам?


Я работаю на SQL server 2012 и сталкиваюсь с проблемой : я не могу обновить статус, чтобы соответствовать символам, где ключ подписи имеет звезды * .

Мне нужно обновить статус, чтобы соответствовать символам, где начинается ключ подписи, например

Signature Key        Group Id   Portion Key     Status
    *$*$**s$***$**$**$*   3          12s            Match Characters


идентификатор группы 3 из ключа подписи выше-это **s, который должен равняться ключу части 12s, поэтому статус должен совпадать с символами .

но если значение идентификатора группы равно **f, а значение ключа части равно 15g, то оно будет не соответствовать статусу символа

потому что g не равно f.

Create table #Ref
(
SignatureKey  nvarchar(50),
GroupId int,
PortionKey nvarchar(50),
Status nvarchar(100)
)
insert into #Ref(SignatureKey,GroupId,PortionKey,status)
values
('*$*$C$***$**$**$*',3,'s',NUll),
('*$*$*$FG$*$**$*',4,'F',NUll),
('*$*$*$***$*$D$*',6,'D',NUll),
('*$t**$*$***$***$**$*',2,'t12',NUll),
('*$**$*$***$**t$**$*',5,'12t',NUll)



ожидаемый результат :

Signature Key        Group Id   Portion Key Status
*$*$C$***$**$**$*     3          s          Not Match Characters
*$*$*$FG$*$**$*       4          F          Not Match Characters
*$*$*$***$*$D$*       6          D          Not Match Characters
*$t**$*$***$***$**$*  2          t12        Match Characters
*$**$*$***$**t$**$*   5          12t        Match Characters


то, что мне нужно сказать, - это статус с символами be Match в случае значения ключа подписи, равного ключу части

точно так же, как (c = c) или ключ подписи имеют звезды на идентификаторе группы, поэтому я буду игнорировать starts * и сравнивать

символ с символом as (*f = 1f) означает, что если у меня есть звезды, то игнорируйте сравнение с символом.

Что я уже пробовал:

update r set r.Status='Not Match Charachters'
from #Ref r
cross apply
dbo.Split(r.SignatureKey,'$') f where CAST (r.GroupId AS INT) = f.Id and r.PortionKey <> f.Data

Maciej Los

Что такое тело dbo.Функция разделения?

ahmed_sa

dbo.split встроены в функцию

Richard Deeming

Нет, это не так. Встроенная функция-это STRING_SPLIT (Transact-SQL) - SQL Server | Microsoft Docs[^], который был добавлен в SQL Server 2016.

Maciej Los

:большой палец вверх:

ahmed_sa

извините функция существует на
dbo.split функция существует на
https://www.sqlteam.com/forums/topic.asp?TOPIC_ID=50648

1 Ответов

Рейтинг:
9

CHill60

У меня есть тайм-аут на это, так что я опубликую технику, которую я применяю, и то, что у меня есть до сих пор. Надеюсь, я смогу с вами связаться.

Для любого из ваших PortionKey Я генерировал (с помощью табличной функции) список возможных совпадений.

Например, если у меня есть строка t12 Я хочу "Т12","Т**','*1*','**2','t1*','t*2','*12'. Тогда вы можете просто сопоставить их с ключом подписи

Чтобы сгенерировать эти комбинации я использовал вот это

declare @string nvarchar(2000) = 't12';
--DECLARE @wildchar char(1) = '*';

IF OBJECT_ID('tempdb..#Combos') IS NOT NULL DROP TABLE #Combos
IF OBJECT_ID('tempdb..#Patterns') IS NOT NULL DROP TABLE #Patterns

;WITH numsCTE AS
(
    SELECT  1 AS num
    UNION ALL
    SELECT  num + 1
    FROM    numsCTE
    WHERE num < LEN(@string) 
)
,RecurCTE AS 
(
	SELECT num, CAST(num AS NVARCHAR(2000)) as Combination, REPLICATE('*', LEN(@string)) as Pattern
	FROM numsCTE
	UNION ALL
	SELECT n.num,CAST(r.Combination + ',' + CAST(n.num AS NVARCHAR(10)) AS NVARCHAR(2000)), REPLICATE('*', LEN(@string)) as Pattern
	FROM RecurCTE r
INNER JOIN numsCTE n ON n.num > r.num
)
SELECT ROW_NUMBER() OVER (ORDER BY LEN(Combination),Combination) AS RN, Combination, Pattern
INTO #combos
FROM RecurCTE
ORDER BY LEN(Combination),Combination;

select o.RN, [value] 
INTO #Patterns
from #combos o 
cross apply (select o.RN, [value] FROM STRING_SPLIT(o.combination,',') ) AS CA

select * from #combos
select * from #Patterns
Первый набор CTEs генерирует все комбинации позиций в строке (внимание - так он будет работать только до 9 символов в строке!!). В конце бит получает список всех замен, которые мне нужно сделать - я добрался до
UPDATE o
SET o.Pattern = STUFF(o.Pattern, CAST(b.value AS int), 1, SUBSTRING(@string, CAST(b.value AS int),1))
FROM #combos o 
inner join #Patterns b on o.RN =b.rn
но это не работает, и у меня сейчас нет времени выяснять, почему. Надеюсь, вы поняли суть того, что я предлагаю


Maciej Los

5ed!!!