Как извлечь частичную строку на основе символов в SQL-сервере?

У меня есть строковое поле в SQL Server, которое содержит несколько элементов, которые я хочу разбить на отдельные поля. Два из них содержат двойные кавычки. Вот пример того, что существует в этой области. Это все в одной строке

Пример: 111668999 555444888 "3 LOW" "5 HIGH"

То, что я хотел бы сделать, это разбить "3 LOW" и "5 HIGH" на их собственные новые поля, но оставить кавычки вокруг них. Я успешно разделил числовые значения, исходя из них, поэтому я просто работаю над значениями "3 LOW" и "5 HIGH". Я уверен, что это можно сделать с помощью комбинации CHARINDEX и SUBSTRING, но я изо всех сил пытался определить кавычки в качестве начальной и конечной точек и убедиться, что они остаются включенными в новые поля.

Спасибо!

3 ответа

;with tb(s) as (
   select '111668999 555444888 "3 LOW" "5 HIGH"'
)
select node from tb
cross apply(values(convert(XML,'<n>'+replace(tb.s,'"','</n><n>')+'</n>'))) as c(x)
cross apply( select x.node.value('.','varchar(20)') as node from c.x.nodes('n') x(node)  )as p 
where  patindex('[0-9] [a-Z]%', p.node)>0
    узел
1   3 НИЗКИЙ
2   5 ВЫСОКИЙ

Вы можете создать эту функцию

CREATE FUNCTION [dbo].[SplitString]
(
@sString nvarchar(2048),
@cDelimiter nchar(3),
@mark nchar(1)
)
RETURNS @tParts TABLE ( part nvarchar(2048) )
AS
BEGIN
if @sString is null return
declare @iStart int,
        @iPos int
if substring( @sString, 1, 1 ) = @cDelimiter 
begin
    set @iStart = 2
    insert into @tParts
    values( null )
end
else 
    set @iStart = 1
while 1=1
begin
    set @iPos = charindex( @cDelimiter, @sString, @iStart )
    if @iPos = 0
        set @iPos = len( @sString )+1
    if @iPos - @iStart > 0          
        insert into @tParts
        values  ( replace(ltrim(substring( @sString, @iStart, @iPos-        
    @iStart )) + @mark,'""','"'))       
    set @iStart = @iPos+1
    if @iStart > len( @sString ) 
        break
  end
  RETURN

END

GO

И используйте это так

SELECT * FROM [dbo].[SplitString] 
('"3 LOW" "5 HIGH" "7 HIGH" "8 HIGH"','" "', '"')

результат

"3 LOW"
"5 HIGH"
"7 HIGH"
"8 HIGH"

Это поместит значения в поля, а не в строки

пример

Declare @YourTable table (ID int,SomeCol varchar(max))
Insert Into @YourTable values
(1,'111668999 555444888 "3 LOW" "5 HIGH"')


Select A.ID
      ,B.*
 From @YourTable A
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = '"'+ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = '"'+ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                From  (Select Cast('<x>' + replace((Select replace(A.SomeCol,' "','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

Возвращает

введите описание изображения здесь

Другие вопросы по тегам