Как извлечь конкретный текст из строки с помощью SSMS? - PullRequest
0 голосов
/ 26 октября 2018

У меня есть строка, которая имеет информацию о объеме в терминах ML и LTR.Как извлечь его из поля ниже?

Текст:

BRWN SPRTS 50 ML DRK RM AL NN SLR JRR

BRWN SPRTS DRK RM AL NN SLRJRR 700ML

700 мл DRK RM AL NN SNG-SM ALL OTHR

SPRTS DRK RM AL 1,5 LTR NN TH-DPP-SHR

NN TH-KRKN TH-KRKN-BLCK-SPCD-RM 3.5 LTR

NN TH-KRKN 50 ML TH-KRKN-BLCK-SPCD-RM

Я хочу, чтобы результат был таким:

50 мл

700 мл

700 мл

1,5LTR

3,5LTR

50 мл

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Это должно дать вам результаты, которые вы ищете, без каких-либо циклов ...

IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
BEGIN DROP TABLE #TestData; END;

CREATE TABLE #TestData (
    CharacterString VARCHAR(100) NOT NULL 
    );
INSERT #TestData(CharacterString) VALUES
    ('BRWN SPRTS 50 ML DRK RM AL N N SLR JRR'),
    ('BRWN SPRTS DRK RM AL N N SLR JRR 700ML'),
    ('700 ML DRK RM AL N N SNG-SM ALL OTHR'),
    ('SPRTS DRK RM AL 1.5 LTR N N TH-DPP-SHR'),
    ('N N TH-KRKN TH-KRKN-BLCK-SPCD-RM 3.5 LTR'),
    ('N N TH-KRKN 50 ML TH-KRKN-BLCK-SPCD-RM');

--==================================================================

SELECT 
    *,
    Output = REPLACE(ISNULL(
        SUBSTRING(td.CharacterString, ns.num_ml, se.ml_end - ns.num_ml),
        SUBSTRING(td.CharacterString, ns.num_ltr, se.ltr_end - ns.num_ltr)
        ), ' ', '')
FROM
    #TestData td
    CROSS APPLY ( VALUES (
        NULLIF(PATINDEX('%[0-9]%ML%', td.CharacterString), 0),
        NULLIF(PATINDEX('%[0-9]%LTR%', td.CharacterString), 0)
        ) ) ns (num_ml, num_ltr)
    CROSS APPLY ( VALUES (
        CHARINDEX('ML', td.CharacterString, ns.num_ml) + 2,
        CHARINDEX('LTR', td.CharacterString, ns.num_ltr) + 3
        ) ) se (ml_end, ltr_end);

Reults ...

Output
------------
50ML
700ML
700ML
1.5LTR
3.5LTR
50ML
0 голосов
/ 26 октября 2018
CREATE TABLE #TABLE1
    ([CLOUMNN] VARCHAR(40))
;

INSERT INTO #TABLE1
    ([CLOUMNN])
VALUES
    ('BRWN SPRTS 50 ML DRK RM AL N N SLR JRR'),
    ('BRWN SPRTS DRK RM AL N N SLR JRR 700ML'),
    ('700 ML DRK RM AL N N SNG-SM ALL OTHR'),
    ('SPRTS DRK RM AL 1.5 LTR N N TH-DPP-SHR'),
    ('N N TH-KRKN TH-KRKN-BLCK-SPCD-RM 3.5 LTR'),
    ('N N TH-KRKN 50 ML TH-KRKN-BLCK-SPCD-RM')
;
CREATE FUNCTION DBO.UDF_GETNUMERIC_1  
(@STRALPHANUMERIC VARCHAR(256))  
RETURNS VARCHAR(256)  
AS  
BEGIN  
DECLARE @INTALPHA INT  
SET @INTALPHA = PATINDEX('%[^0-9.]%', @STRALPHANUMERIC)  
BEGIN  
WHILE @INTALPHA > 0  
BEGIN  
SET @STRALPHANUMERIC = STUFF(@STRALPHANUMERIC, @INTALPHA, 1, '' )  
SET @INTALPHA = PATINDEX('%[^0-9.]%', @STRALPHANUMERIC )  
END  
END  
RETURN ISNULL(@STRALPHANUMERIC,0)  
END  

SELECT CONCAT([STRING],CASE WHEN [CLOUMNN]>0 THEN 'ML' ELSE 'LTR' END) 
FROM (SELECT DBO.UDF_GETNUMERIC_1([CLOUMNN])[STRING] ,CHARINDEX('ML',CLOUMNN)
 CLOUMNN FROM #TABLE1)A

OUTPUT

50ML
700ML
700ML
1.5LTR
3.5LTR
50ML
...