根据需要在SQL Server中拆分字符串

时间:2016-04-24 09:33:05

标签: sql sql-server

这是输入表,其中包含父sku,即BOO3及其子skus BOO3L,BOO3S,BOO3M。到目前为止,这是我的代码,我被困在这里。

enter image description here

categoriesurl-key列应该像预期结果一样进行更改。 url-key列应为小写,以-分隔。

我希望输出看起来像这样:

enter image description here

1 个答案:

答案 0 :(得分:1)

看起来你需要一些SQL Server功能。

首先是一个包含您提供的数据的测试表:

CREATE TABLE [TestTable] 
([sku] VARCHAR(10), [product_type] VARCHAR(50), [categories] VARCHAR(100),
 [name] VARCHAR(255), [url_key] VARCHAR(255));

 INSERT INTO [TestTable]
 VALUES
 ('B003', 'configurable', 'Men''s PJs → Comical Boxers', 'Wanna Moose Around Comical Boxer', NULL),
 ('B003L', 'simple', 'Men''s PJs → Comical Boxers', 'Wanna Moose Around Comical Boxer', NULL),
 ('B003M', 'simple', 'Men''s PJs → Comical Boxers', 'Wanna Moose Around Comical Boxer', NULL),
 ('B003S', 'simple', 'Men''s PJs → Comical Boxers', 'Wanna Moose Around Comical Boxer', NULL);

 SELECT * FROM [TestTable];

对于类别,您需要CHARINDEX()PATINDEX()来删除'→' ( alt + 26显然,我必须查找)。

网址需要LOWER()才能删除标题大小写,而REPLACE()则需要将空格更改为连字符。

最后,您的小,中,大'需要混合RIGHT()来检查它是什么,并CASE添加相关后缀。

 SELECT 
        [sku]
    ,   [categories] = SUBSTRING([categories], CHARINDEX('→', [categories]) + 1, 1000)
    ,   [name]
    ,   [url-key] = CASE 
                        WHEN RIGHT([sku], 1) = 'L' THEN REPLACE(LOWER([name]), ' ', '-') + '-large'
                        WHEN RIGHT([sku], 1) = 'M' THEN REPLACE(LOWER([name]), ' ', '-') + '-medium'
                        WHEN RIGHT([sku], 1) = 'S' THEN REPLACE(LOWER([name]), ' ', '-') + '-small'
                        ELSE REPLACE(LOWER([name]), ' ', '-')
                    END
    FROM [TestTable]
    ORDER BY (CASE 
                WHEN RIGHT([sku], 1) = 'L' THEN 4
                WHEN RIGHT([sku], 1) = 'M' THEN 3
                WHEN RIGHT([sku], 1) = 'S' THEN 2
                ELSE 1
            END) DESC

DROP TABLE [TestTable];

最后另一个CASE语句让ORDER BY正确,因为据我所知,没有自然的方法可以按照你想要的方式订购。