выберите строку между 3-м и 4-м разделителем трубы

У меня есть столбец, содержащий такие значения, как

Column
Asset|Class1|Category1|Group1|Account1
Expense|Class23|Category23|Group23|Account23

Я хочу выбрать строку между 3-м и 4-м вхождением разделителя каналов, как мне этого добиться?

Я пробовал функции PARSENAME и charindex+stuff, но у них есть ограничения, например, не более 128 символов. Также наш SQL-сервер имеет ограниченную поддержку регулярных выражений. Есть идеи?

SELECT REVERSE(PARSENAME(REVERSE(replace(LTRIM(Столбец), '|', '.')), 3))

Мой выбор должен вернуться: Group1 Group23


person user_KoBy    schedule 31.07.2019    source источник
comment
Разве вы не можете исправить данные при импорте, чтобы они помещались в несколько столбцов?   -  person Gordon Linoff    schedule 31.07.2019
comment
Можно ли исправить дизайн и вынести эти значения в отдельные столбцы? Это лучший способ справиться с этим.   -  person Sean Lange    schedule 31.07.2019
comment
Какая версия SQL? Если в 2017 году вы можете просто использовать разделенную строку: docs.microsoft.com/en-us/sql/t-sql/functions/ Или создайте собственную версию функции. stackoverflow.com/questions /6619810/   -  person Brad    schedule 31.07.2019
comment
Существует множество функций разделения строк, которые возвращают номера элементов, которые позволяют вам применять перекрестное применение к столбцу строки, а затем, например, выбирать только третий элемент.   -  person pmbAustin    schedule 31.07.2019


Ответы (2)


Возможно это поможет

Пример

Declare @YourTable table (ID int,[Column] varchar(max))
Insert Into @YourTable values
 (1,'Asset|Class1|Category1|Group1|Account1')
,(2,'Expense|Class23|Category23|Group23|Account23')

Select ID
      ,SomeValue = convert(xml,'<x>' + replace([Column],'|','</x><x>')+'</x>').value('/x[3]','varchar(100)')
 From @YourTable

Возврат

ID  SomeValue
1   Category1
2   Category23
person John Cappelletti    schedule 31.07.2019
comment
@user_KoBy Рад помочь - person John Cappelletti; 31.07.2019

Вы также можете использовать STRING_SPLIT() если у вас 2016+

CREATE TABLE T(
  ID INT IDENTITY(1,1),
  Str VARCHAR(45)
);

INSERT INTO T(Str) VALUES 
('Asset|Class1|Category1|Group1|Account1'),
('Expense|Class23|Category23|Group23|Account23');

SELECT V Str
FROM (
       SELECT Value V,
              ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID) RN
       FROM T CROSS APPLY STRING_SPLIT(Str, '|')
     ) TT
WHERE RN = 3;

Возвраты:

Str
---------
Category1
Category23
person Ilyes    schedule 31.07.2019
comment
К вашему сведению, нет GTD в порядке string_split(). dba.stackexchange.com/questions/207274/ Полное раскрытие, я еще не видел, чтобы это терпело неудачу, но опять же, я еще не был поражен молнией. :) - person John Cappelletti; 31.07.2019
comment
Дело не только в 2016+, но и в вашей базе данных должен быть установлен уровень совместимости 130. - person DeFlanko; 19.10.2020