MS SQL Server - получить значения до и после разделителя - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь найти способ выбора определенных значений из строки, разделенной разделителем, в данном случае запятыми.Мне нужно сообщать каждое значение после запятой в отдельном поле.Ниже приведен пример для справки:

String: FirstVal,FirstName,HomeAddress,HomeCity,HomeCountry

Это значение «FirstVal» можно игнорировать, мне не нужно сообщать об этом, но мне нужно сообщать об этом после первой запятой,и каждый отдельный после каждой из других запятых, каждый в отдельном поле.Кроме того, я не контролирую длину строки или длину каждого значения, другими словами, может быть бесконечное количество значений различной длины, разделенных запятыми.Тем не менее, я знаю, что значения могут быть только VARCHAR, поэтому преобразование / приведение не будет проблемой.И последнее, я нахожусь на SQL Server 2012, поэтому, к сожалению, нельзя использовать функцию STRING_SPLIT, если кто-то может это сделать, используя эту функцию.

Поскольку первое значение можно игнорироватьэто то, что мне нужно сообщить из строки:

NameField: FirstName
AddressField: HomeAddress
AddressCity: HomeCity
AddressCountry: HomeCountry

Я искал на форуме жизнеспособное решение, и я экспериментировал с некоторыми итерациями CHARINDEX, но это неПохоже, это не так, поэтому я очень признателен за помощь!

Заранее всем спасибо!

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Просто еще один вариант, использующий немного XML. Очевидно, что вы можете добавлять, удалять и / или переименовывать столбцы, но для динамически именованных столбцов потребуется динамический SQL.

* ** 1003 тысяча два * Пример
Declare @S varchar(max) = 'FirstVal,FirstName,HomeAddress,HomeCity,HomeCountry'

Select Pos1 = xDim.value('/x[1]','varchar(max)')
      ,Pos2 = xDim.value('/x[2]','varchar(max)')
      ,Pos3 = xDim.value('/x[3]','varchar(max)')
      ,Pos4 = xDim.value('/x[4]','varchar(max)')
      ,Pos5 = xDim.value('/x[5]','varchar(max)')
From  ( values (cast('<x>' + replace((Select replace(@S,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml))) as A(xDim)

Возвращает

Pos1        Pos2        Pos3        Pos4        Pos5
FirstVal    FirstName   HomeAddress HomeCity    HomeCountry
0 голосов
/ 11 июня 2019

Вот один простой способ справиться с этим. Он использует функцию DelimitedSplit8K от Джеффа Модена, которую вы можете найти здесь .

declare @String varchar(200) = 'FirstVal,FirstName,HomeAddress,HomeCity,HomeCountry'

select NameField = max(case when s.ItemNumber = 2 then s.Item end)
    , AddressField = max(case when s.ItemNumber = 3 then s.Item end)
    , AddressCity = max(case when s.ItemNumber = 4 then s.Item end)
    , AddressCountry = max(case when s.ItemNumber = 5 then s.Item end)
from dbo.DelimitedSplit8K(@String, ',') s

Выход:

NameField   AddressField    AddressCity AddressCountry
FirstName   HomeAddress     HomeCity    HomeCountry
...