SQL Server строка разделена последним, но один - PullRequest
0 голосов
/ 23 мая 2018

В таблице есть столбец со значениями

 ColA
------

a.b.c.d.e (car.make.model, car.la, kg)

ab.cd.ef (car.make.model)

a1.b2.c3.d4.e5(car.make.model, car.la, kg, av.vc.de)

Я хочу написать sql-запрос для разделения ColA по разделителю "."и выберите последний, но один.

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

Result
------
d

cd

d4

Я пробовал ParseName, но не вижу возможности выбрать последний, кроме одного.

Спасибо

Ответы [ 4 ]

0 голосов
/ 23 мая 2018

Просто поиграть, используя STRING_SPLIT :

SELECT ColA, t.value
FROM table1
CROSS APPLY(SELECT value, 
                   COUNT(*) OVER () as cnt,
                   ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn
            FROM STRING_SPLIT(ColA, '.')) AS t
WHERE t.rn = t.cnt - 1

Примечание: Функция доступна в SQL Server 2016.

Примечание 2: Запрос работает при условии, что функция возвращает каждое значение в том же порядке, в котором оно отображается внутри строки.

0 голосов
/ 23 мая 2018

Использование Jeff Moden's DelimitedSplit8K:

USE Sandbox;
GO

CREATE TABLE #Sample (ColA varchar(500));
GO
INSERT INTO #Sample
VALUES ('a.b.c.d.e'),
       ('ab.cd.ef'),
       ('a1.b2.c3.d4.e5');
GO

SELECT *
FROM #Sample;

WITH Split AS(
    SELECT S.ColA,
           DS.*,
           MAX(DS.ItemNumber) OVER (PARTITION BY S.ColA) AS Items
    FROM #Sample S
         CROSS APPLY DelimitedSplit8K(S.ColA,'.') DS)
SELECT Item
FROM Split
WHERE ItemNumber = Items - 1;

GO

DROP TABLE #Sample

В идеале, однако, не храните ваши данные в формате с разделителями.:)

0 голосов
/ 23 мая 2018

Попробуйте

;WITH CTE(ColA)
AS
(
SELECT 'a.b.c.d.e'      UNION ALL
SELECT 'ab.cd.ef'       UNION ALL
SELECT 'a1.b2.c3.d4.e5'
)
SELECT ColA,REVERSE(SUBSTRING(ReqColA,0,CHARINDEX('.',(ColA)))) AS ReqColA
  FROM
(
SELECT ColA ,SUBSTRING(REVERSE(ColA),CHARINDEX('.',REVERSE(ColA))+1,LEN(REVERSE(ColA))) AS ReqColA  FROM CTE
)dt

Результат

ColA            ReqColA
-----------------------
a.b.c.d.e       d
ab.cd.ef        cd
a1.b2.c3.d4.e5  d4
0 голосов
/ 23 мая 2018

Почему бы просто не использовать подстроку?

DECLARE @ColA NVARCHAR(100) = 'a1.b2.c3.d4.e5(car.make.model, car.la, kg, av.vc.de)';
SELECT REVERSE(LEFT(RIGHT(REVERSE(LEFT(@ColA, CHARINDEX('(', @ColA)-1)), LEN(LEFT(@ColA, CHARINDEX('(', @ColA)-1))-CHARINDEX('.',REVERSE(LEFT(@ColA, CHARINDEX('(', @ColA)-1)))), CHARINDEX('.',RIGHT(REVERSE(LEFT(@ColA, CHARINDEX('(', @ColA)-1)), LEN(LEFT(@ColA, CHARINDEX('(', @ColA)-1))-CHARINDEX('.',REVERSE(LEFT(@ColA, CHARINDEX('(', @ColA)-1)))))-1))

Однако это последнее изменение НЕ обрабатывает случай, когда в строке нет . или ( - не стесняйтесь расширять запроссоответственно

...