Разбить строку в SQL по дефису в версии 2012 - PullRequest
0 голосов
/ 13 декабря 2018

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

1. abc-def-Opto
2. abc-def-ijk-5C-hello-Opto
3. abc-def-ijk-4C-hi-Build 
4. abc-def-ijk-4C-123-suppymanagement

Требуемый набор результатов:

  1. def
  2. привет
  3. привет
  4. 123

Каксделать это в запросе SQL, чтобы получить этот набор результатов.У меня MSSQL 2012 версия Требуется общий SQL, который может получить набор результатов

Ответы [ 4 ]

0 голосов
/ 13 декабря 2018

Вы можете сделать как

WITH CTE AS
(
  SELECT 1 ID,'abc-def-Opto' Str
  UNION
  SELECT 2, 'abc-def-ijk-5C-hello-Opto'
  UNION
  SELECT 3, 'abc-def-ijk-4C-hi-Build'
  UNION
  SELECT 4, 'abc-def-ijk-4C-123-suppymanagement'
)
SELECT ID,
       REVERSE(LEFT(REPLACE(P2, P1, ''), CHARINDEX('-', REPLACE(P2, P1, ''))-1)) Result
FROM (
       SELECT LEFT(REVERSE(Str), CHARINDEX('-', REVERSE(Str))) P1,
              REVERSE(Str) P2,
              ID
       FROM CTE
     ) T;

Возвраты:

+----+--------+
| ID | Result |
+----+--------+
|  1 | def    |
|  2 | hello  |
|  3 | hi     |
|  4 | 123    |
+----+--------+

Демо

0 голосов
/ 13 декабря 2018

Я не уверен, что этот скрипт будет в точности соответствовать вашим требованиям, но я просто пытаюсь дать представление о том, как разделить данные

IF OBJECT_ID('tempdb..#Temp')IS NOT NULL
DROP TABLE #Temp
;WITH CTE(Id,data)
AS
(
SELECT 1,'abc-def-Opto'                 UNION ALL
SELECT 2,'abc-def-ijk-5C-hello-Opto'    UNION ALL
SELECT 3,'abc-def-ijk-4C-hi-Build'      UNION ALL
SELECT 4,'abc-def-ijk-4C-123-suppymanagement'
)
,Cte2
AS
(
SELECT Id, CASE WHEN Id=1   AND  Setdata=1 THEN data
                WHEN Id=2   AND  Setdata=2 THEN data
                WHEN Id=3   AND  Setdata=3 THEN data
                WHEN Id=4   AND  Setdata=4 THEN data
                ELSE NULL 
            END AS Data
FROM
(
SELECT  Id,
        Split.a.value('.','nvarchar(1000)') AS Data,
        ROW_NUMBER()OVER(PARTITION BY id ORDER BY id) AS Setdata
FROM(
SELECT Id,
       CAST('<S>'+REPLACE(data ,'-','</S><S>')+'</S>' AS XML) AS data
FROM CTE
) AS A
CROSS APPLY data.nodes('S') AS Split(a)
)dt
)
SELECT * INTO #Temp FROM Cte2 

SELECT STUFF((SELECT DISTINCT ', '+ 'Set_'+CAST(Id  AS VARCHAR(10))+':'+Data
FROM #Temp WHERE ISNULL(Data,'')<>'' FOR XML PATH ('')),1,1,'')

Результат

Set_1:abc, Set_2:def, Set_3:ijk, Set_4:4C
0 голосов
/ 13 декабря 2018

Не вдаваясь в XML, просто используя строковые функции сервера sql.

Declare @YourTable Table ([SomeCol] varchar(50))
Insert Into @YourTable Values 
 ('abc-def-Opto')
,('abc-def-ijk-5C-hello-Opto')
,('abc-def-ijk-4C-hi-Build')
,('abc-def-ijk-4C-123-suppymanagement');


SELECT * 
        ,RTRIM(LTRIM(REVERSE( 
            SUBSTRING(
                    SUBSTRING(REVERSE([SomeCol]) , CHARINDEX('-', REVERSE([SomeCol]))  +1 , LEN([SomeCol]) )
                     , 1 , CHARINDEX('-', SUBSTRING(REVERSE([SomeCol]) , CHARINDEX('-', REVERSE([SomeCol]))  +1 , LEN([SomeCol]) ) ) -1
                    )
                )))
FROM @YourTable
0 голосов
/ 13 декабря 2018

Есть много способов разбить / разобрать строку.ParseName () потерпит неудачу, потому что у вас может быть более 4 позиций.

Один из вариантов (просто для удовольствия) - использовать немного XML.

  1. Перевернуть строку
  2. Преобразовать в XML
  3. Получить второй узел
  4. Отменить желаемое значение для окончательного представления

Пример

Declare @YourTable Table ([SomeCol] varchar(50))
Insert Into @YourTable Values 
 ('abc-def-Opto')
,('abc-def-ijk-5C-hello-Opto')
,('abc-def-ijk-4C-hi-Build')
,('abc-def-ijk-4C-123-suppymanagement')

Select * 
      ,Value = reverse(convert(xml,'<x>'+replace(reverse(SomeCol),'-','</x><x>')+'</x>').value('x[2]','varchar(150)'))
 from @YourTable

Возвращает

SomeCol                             Value
abc-def-Opto                        def
abc-def-ijk-5C-hello-Opto           hello
abc-def-ijk-4C-hi-Build             hi
abc-def-ijk-4C-123-suppymanagement  123
...