Разделить текст по пробелам в SQL Server 2012

size = 3
matrix_surprise = [[0] * size] * size
matrix = [[0]*size for i in range(size)]

Frames and Objects [/g1]

Live Python Tutor Визуализировать

3
задан marc_s 24 March 2019 в 07:05
поделиться

2 ответа

Вы можете разбить строку, используя XML. Сначала вам нужно преобразовать строку в XML и заменить пробел на start и end XML tags.

Как только строка преобразована в XML, вы можете использовать XQuery, чтобы получить результат в правильном формате.

Чтобы отобразить данные в нескольких столбцах, вы можете просто использовать PIVOT

;WITH CTE AS
(
 SELECT 
 F1.results,
 O.splitdata,
 row_number() over(partition by results order by (select 1)) rn FROM
    (
        SELECT *, 
        cast('<X>'+replace(F.results,' ','</X><X>')+'</X>' as XML) as xmlfilter 
        from [YourTableName] F
        )F1
        CROSS APPLY
        ( 
            SELECT fdata.D.value('.','varchar(500)') as splitdata 
            FROM f1.xmlfilter.nodes('X') as fdata(D) 
        ) O
        where splitdata <> ''
    ) 

 select [1] [Caption],[2] [Space1],[3] [Space2], [4] [Volume Name] 
 from CTE c
 PIVOT (max(splitdata) for rn in ([1],[2],[3],[4])) pvt

Онлайн-демо

Выходные данные

+---------+--------------+--------------+-------------+
| Caption | Space1       | Space2       | Volume Name |
+---------+--------------+--------------+-------------+
| C:      | 462246113280 | 999651536896 | NULL        |
+---------+--------------+--------------+-------------+
| E:      | 636080054272 | 799165902848 | LOG         |
+---------+--------------+--------------+-------------+
| I:      | 166207356928 | 959589646336 | INDEXS      |
+---------+--------------+--------------+-------------+
| P:      | 220825387008 | 959589646336 | DADOS       |
+---------+--------------+--------------+-------------+
0
ответ дан PSK 24 March 2019 в 07:05
поделиться

Вы можете попытаться создать функцию fn_split.

CREATE FUNCTION fn_split 
( @Words nvarchar(MAX)
, @splitStr varchar(50) 
)
RETURNS @Result_Table TABLE
       (
         [word] nvarchar(max) NULL
       )
BEGIN 
    Declare @TempStr nvarchar(MAX)

    WHILE (CHARINDEX(@splitStr,@Words)>0)
    BEGIN
        Set @TempStr=SUBSTRING(@Words,1,CHARINDEX(@splitStr,@Words)-1)
        Insert into @Result_Table (word) Values (@TempStr)

        Set @Words = REPLACE(@Words,@TempStr+@splitStr,'')
    END/*End While*/

    IF(LEN(RTRIM(LTRIM(@Words)))>0 And CHARINDEX(@splitStr,RTRIM(LTRIM(@Words)))=0) 
    Begin
        Set @TempStr=@Words 

        Insert into @Result_Table (word) Values (@TempStr)

    End 

   RETURN 
END

затем используйте небольшой навык, позволяющий умножить на один пробел в DISK_VOLUME, заменить три раза.

В следующем шаге используйте оконную функцию row_number, чтобы получить номер для агрегатной функции условия.

;WITH CTE as(
    SELECT val,word,ROW_NUMBER() OVER(PARTITION BY val order by val) rn
    FROM (
        SELECT replace(replace(replace(DISK_VOLUME,' ','*&'),'&*',''),'*&',' ') val
        FROM T
    ) t1 CROSS APPLY fn_split(t1.val,' ') v
)

SELECT max(CASE WHEN rn = 1 THEN word END) 'Caption',
       max(CASE WHEN rn = 2 THEN word END) 'Space1',
       max(CASE WHEN rn = 3 THEN word END) 'Space 2',
       max(CASE WHEN rn = 4 THEN word END) 'Volume Name '
FROM CTE
GROUP BY val

sqlfiddle

0
ответ дан D-Shih 24 March 2019 в 07:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: