Нужна помощь в преобразовании строк на основе нескольких правил - PullRequest
2 голосов
/ 16 мая 2019

У меня есть столбец func_name.У меня есть набор правил для этого столбца func_name для создания func_short_name.

Желаемая логика для func_short_name:

  1. использовать все, что находится справа от '> ';перед каждым последующим знаком «+» или «@» в поле FUNC_NAME

  2. Каждый раз, когда появляется «+» или «@», добавляйте его к func_short_name

Пример:

имя_функции: набор инструментов / matlab / cefclient / + matlab / + internal / getOpenPort.p> getOpenPort

func_short_name: matlab.internal.getOpenPort

Приведенный выше пример добавляет 'matlab' к 'внутреннему', так как за ним следуют '+' и 'getOpenPort', так как он находится справа от '>'

Как мне принять во вниманиекаждый случай «+» или «а».Может ли кто-нибудь помочь мне создать SQL или хранимый процесс?Спасибо!

Я пытался реализовать правила по отдельности, но я не могу сделать рекурсивное добавление при каждом появлении '+' или '@'

select  substring(FUNC_NAME,charindex('a',FUNC_NAME)+1,100)
FROM table

select  FUNC_NAME,
charindex('@',FUNC_NAME)+1,
charindex('/',FUNC_NAME)-1
from table

select  concat(substring(FUNC_NAME,charindex('@',FUNC_NAME)+1,charindex('/',FUNC_NAME)-1),'.',substring(FUNC_NAME,charindex('>',FUNC_NAME)+1,100))
FROM table

func_name: toolbox / matlab /cefclient / + matlab / + internal / getOpenPort.p> getOpenPort

func_short_name: matlab.internal.getOpenPort

Другой пример: имя функции: набор инструментов / символический / символический / @ sym / @ aem /diag.m> diag

func_short_name: sym.aem.diag

Ответы [ 3 ]

1 голос
/ 17 мая 2019

Это следует делать независимо от версии SQL Server.

DECLARE @func_name VARCHAR(200);
DECLARE @func_short_name VARCHAR(100) = '';
DECLARE @i INT = 1;
DECLARE @func_name_length INT;
DECLARE @start_position INT = 0;
DECLARE @end_position INT = 0;
DECLARE @gt_position INT = 0;

SET @func_name = 'toolbox/matlab/cefclient/+matlab/+internal/getOpenPort.p>getOpenPort';
--SET @func_name = 'toolbox/symbolic/symbolic/@sym/@aem/diag.m>diag';

SET @i = 1;
SET @func_name_length = LEN(@func_name);

-- loop through string character by character
WHILE @i <= @func_name_length
BEGIN
    IF (SUBSTRING(@func_name, @i, 1)) IN ('+', '@')
    BEGIN
        SET @start_position = @i;
    END;

    -- ending character found after starting character has been found
    IF (SUBSTRING(@func_name, @i, 1)) = '/'
       AND @start_position > 0
    BEGIN

        SET @end_position = @i;
        SET @func_short_name = @func_short_name
                               + SUBSTRING(@func_name, @start_position + 1, (@end_position - 1) - @start_position)
                               + '.';
        SET @start_position = 0;
    END;

    SET @i += 1;

END;

-- find greater than character
SET @gt_position = CHARINDEX('>', @func_name);

SET @func_short_name = @func_short_name + SUBSTRING(@func_name, @gt_position + 1, @func_name_length - @gt_position);

SELECT @func_name AS [FUNC NAME], @func_short_name AS [FUNC SHORT NAME];
0 голосов
/ 17 мая 2019

Это решение, основанное на рекурсивном общем табличном выражении, работает с любой версией SQL-сервера, начиная с 2005 года, но не совсем строго в отношении разделяющих символов. Шаблон '%[@+>]%' ищет любой из символов: @, + или >. Тем не менее, он возвращает желаемый результат: matlab.internal.getOpenPort

declare @f varchar(255); 
set @f='toolbox/matlab/cefclient/+matlab/+internal/getOpenPort.p>getOpenPort'+'/';

With rcte as (
 select 0 n,@f str, patindex('%[@+>]%',@f) p union all
 select p, substring(str, p+1,255), 
   patindex('%[@+>]%',substring(str, p+1,255)) 
 from rcte where p>0
)
SELECT STUFF((SELECT '.' +LEFT(str,charindex('/',str)-1)
      FROM rcte
      WHERE n>0
      FOR XML PATH('')), 1, 1, '') short

@f - это переменная, содержащая длинное имя функции (с добавленным / в конце), которую необходимо преобразовать.

Смотрите здесь для демонстрации: https://rextester.com/MFVO10768

0 голосов
/ 17 мая 2019

Только если это SQL Server 2017 +

Инициализация:

DECLARE @Table TABLE (Func_Name NVARCHAR(MAX));
INSERT INTO @Table (Func_Name)VALUES
     ('toolbox/matlab/cefclient/+matlab/+internal/getOpenPort.p>getOpenPort')
    ,('toolbox/symbolic/symbolic/@sym/@aem/diag.m>diag')
;

Код:

SELECT STRING_AGG(REPLACE(REPLACE(a.[value],'+',''),'@',''),'.') 
    WITHIN GROUP (ORDER BY rn DESC) AS [Result]
FROM (
    SELECT b.ID,j.[value],ROW_NUMBER()OVER(PARTITION BY b.ID ORDER BY j.[Key] DESC) AS [rn]
    FROM (
        SELECT '["' + REPLACE(REPLACE(t.Func_Name,'/','","'),'>','","') + '"]' AS [value]
            ,ROW_NUMBER()OVER(ORDER BY (SELECT 1)) AS [ID]
        FROM @Table t
    ) b
    CROSS APPLY OPENJSON(b.[value]) j
) a
WHERE (a.[value] LIKE '[+]%' OR a.[value] LIKE '[@]%' OR a.rn = 1 /*last piece*/)
GROUP BY a.ID
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...