Как разделить слова до и после двоеточия в отдельных столбцах строк в SQL - PullRequest
0 голосов
/ 30 мая 2019

У меня есть столбец [LongText] в таблице, и его значение строки объединяет все атрибуты и их значения. Ниже приведен пример. Можем ли мы разделить двоеточие до и после слов на два столбца, как показано в ожидаемом результате? нужно в sql 2014

Longtext

TYPE: SOLID WEDGE 1,SOLID WEDGE 2,  VALVE SIZE: 1 IN,  PRESSURE RATING: 800 LB,  CONNECTION TYPE: SOCKET WELD,  BONNET STYLE: BOLTED

Ожидаемый вывод в 2 столбца Атрибут и значение:

Attribute        | Value
----------------------------------------------
TYPE             | SOLID WEDGE 1,SOLID WEDGE 2
VALVE SIZE       | 1 IN
PRESSURE RATING  | 800 LB
CONNECTION TYPE  | SOCKET WELD
BONNET STYLE     | BOLTED

Ответы [ 2 ]

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

Посмотрите, может ли это помочь. Кроме того, дайте мне знать, если вы хотите, чтобы я объяснил код.

IF EXISTS(SELECT 1 FROM SYS.OBJECTS WHERE NAME = 'fn_GetAttributeAndValueFromLongText' AND TYPE = 'TF')
BEGIN
    DROP FUNCTION dbo.fn_GetAttributeAndValueFromLongText
END
GO

CREATE FUNCTION dbo.fn_GetAttributeAndValueFromLongText ( @String_LongText VARCHAR(MAX) )
RETURNS @TBL_Attribute_Value TABLE 
(
    Attribute VARCHAR(MAX)
  , Value VARCHAR(MAX)
)
AS
BEGIN

    DECLARE @ATTR_VALUE_DELIMITER AS VARCHAR(MAX) = ':'

    WHILE (RTRIM(LTRIM(LEN(@String_LongText))) != 0)
    BEGIN
        DECLARE @String_ATTR VARCHAR(MAX)='', @String_VALUE VARCHAR(MAX)= ''

        SELECT @String_LongText = RTRIM(LTRIM(@String_LongText))

        SELECT @String_ATTR = SUBSTRING(@String_LongText, 1,CHARINDEX(':',@String_LongText)-1)
        SELECT @String_LongText = RIGHT(@String_LongText, LEN(@String_LongText)-(LEN(@String_ATTR)+1))

        IF @String_LongText LIKE '%'+@ATTR_VALUE_DELIMITER+'%'
        BEGIN
            SELECT @String_VALUE = LEFT(SUBSTRING(@String_LongText, 1, CHARINDEX(':', @String_LongText)-1), LEN(SUBSTRING(@String_LongText, 1, CHARINDEX(':', @String_LongText)-1)) - CHARINDEX(',', REVERSE(SUBSTRING(@String_LongText, 1, CHARINDEX(':', @String_LongText)-1))))
            SELECT @String_LongText = RIGHT(@String_LongText, LEN(@String_LongText)-(LEN(@String_VALUE)+1))
        END
        ELSE
        BEGIN
            SELECT @String_VALUE = @String_LongText
            SELECT @String_LongText = REPLACE(@String_LongText, @String_VALUE, '')
        END

        INSERT INTO @TBL_Attribute_Value ([Attribute], [Value])
        VALUES(RTRIM(LTRIM(@String_ATTR)), RTRIM(LTRIM(@String_VALUE))) 
    END

    RETURN
END

GO 

SELECT * FROM dbo.fn_GetAttributeAndValueFromLongText('TYPE: SOLID WEDGE 1,SOLID WEDGE 2,  VALVE SIZE: 1 IN,  PRESSURE RATING: 800 LB,  CONNECTION TYPE: SOCKET WELD,  BONNET STYLE: BOLTED')
0 голосов
/ 30 мая 2019

, чтобы начать с STRING_SPLIT (), что-то вроде:

DECLARE @string varchar(max) = 'TYPE: SOLID WEDGE 1,SOLID WEDGE 2,  VALVE SIZE: 1 IN,  PRESSURE RATING: 800 LB .....';
DECLARE @output varchar(max) = '';
DECLARE @v varchar(max) = (SELECT TOP(1) value from string_split(@string,' '));
WHILE @v <> ''
BEGIN
    select @v;
    SET @string = (SELECT ltrim(substring(@string,LEN(@v)+1,1024)));
    select @string;
    SET @v = (SELECT TOP(1) value from string_split(@string,' '));
END

, что дает: output of above script

, как сказал @Tim, порядок негарантированно будет правильным для вышеприведенного подхода.

так, вторая попытка ?:

DECLARE @string varchar(max) = 'TYPE: SOLID WEDGE 1,SOLID WEDGE 2,  VALVE SIZE: 1 IN,  PRESSURE RATING: 800 LB,  CONNECTION TYPE: SOCKET WELD,  BONNET STYLE: BOLTED';
SELECT * FROM string_split(REPLACE(@string,'  ','#'),'#');

Это надеется (= 'не проверяет'), что нет символов '#' висходная строка.

...