简体   繁体   English

SQL从列中提取数据

[英]SQL Extracting Data from Column

Looking for some SQL help selecting particular data from a column in my table, and creating new columns with that. 寻找一些SQL帮助来从表中的列中选择特定数据,并以此创建新列。 Here's a sample of the data in the AttributeDescription column: 这是AttributeDescription列中的数据示例:

AttributeDescription
----------------------------------
Color: black<br />Size: L
Color: black<br />Size: M
Color: black<br />Size: S
Colour: turquoise<br />Size: XXL
Colour: white<br />Size: M
Colour: white<br />Size: XL
Model: iPhone 5/5s
Model: iPhone 6
Size: 2X-Large
Size: Large
Size: Medium
Size: Medium / Small
Size: Small
Size: XL
Size: X-Large
Size: X-Large / Large`

I would like to turn this into three columns named "Variant_Model", "Variant_Size" and "Variant_Color". 我想将其分为三个列,分别为“ Variant_Model”,“ Variant_Size”和“ Variant_Color”。 End result should be like: 最终结果应为:

Variant_Model |Variant_Size | Variant_Color
--------------+-------------+-------------
              | L           | black
              | M           | black
              | S           | black
              | XXL         | turquoise
              | M           | white
              | XL          | white
iPhone 5/5s   |             |
iPhone 6      |             |
              | 2X-Large    |
              | Large       |
              | Medium      |
              | Medium / Small|
              | Small       |
              | XL          |
              | X-Large     |
              | X-Large / Large|   `

Note that in the original column, the attribute could appear as either "Color" or "Colour". 请注意,在原始列中,该属性可能显示为“颜色”或“颜色”。

Bonus points for standardizing the abbreviated sizes (eg. "L", "M") into the appropriate words! 标准化缩写词(例如“ L”,“ M”)成适当单词的加分!

Thanks very much in advance! 首先十分感谢!

One Way to do it is like this 一种方法是这样的

Query: 查询:

SELECT Model AS Variant_Model,
       CASE
           WHEN size = 'L'
           THEN 'Large'
           WHEN size = 'M'
           THEN 'Medium'
           WHEN size = 'S'
           THEN 'Small'
           WHEN size = 'XL'
           THEN 'X-Large'
           WHEN size = 'XXL'
           THEN '2X-Large'
           ELSE size
       END AS Variant_Size,
       COALESCE(color, Colour) AS Variant_Color
FROM
(
    SELECT id,
           LEFT(REPLACE(REPLACE(CAST(T2.Loc.query('.') AS    VARCHAR(255)), '<X>', ''), '</X>', ''), CHARINDEX(':', REPLACE(REPLACE(CAST(T2.Loc.query('.') AS VARCHAR(255)), '<X>', ''), '</X>', ''))-1) AS header,
           REVERSE(LEFT(REVERSE(REPLACE(REPLACE(CAST(T2.Loc.query('.') AS VARCHAR(255)), '<X>', ''), '</X>', '')), CHARINDEX(':', REVERSE(REPLACE(REPLACE(CAST(T2.Loc.query('.') AS VARCHAR(255)), '<X>', ''), '</X>', '')))-2)) AS Value
    FROM
    (
        SELECT ROW_NUMBER() OVER(ORDER BY AttributeDescription) AS id,
               CAST(('<X>'+REPLACE(REPLACE(AttributeDescription, '<br />', ','), ',', '</X><X>')+'</X>') AS XML) AS String
        FROM #a
    ) T
    CROSS APPLY String.nodes('/X') AS T2(Loc)
) data PIVOT(MAX(value) FOR header IN(Color,
                                      Size,
                                      Model,
                                      Colour)) p;

Complete Working Script 完整的工作脚本

IF OBJECT_ID('tempdb..#a') IS NOT NULL
    DROP TABLE #a;

CREATE TABLE #a(AttributeDescription VARCHAR(255));

INSERT INTO #a
VALUES('Color: black<br />Size: L');

INSERT INTO #a
VALUES('Color: black<br />Size: M');

INSERT INTO #a
VALUES('Color: black<br />Size: S');

INSERT INTO #a
VALUES('Colour: turquoise<br />Size: XXL');

INSERT INTO #a
VALUES('Colour: white<br />Size: M');

INSERT INTO #a
VALUES('Colour: white<br />Size: XL');

INSERT INTO #a
VALUES('Model: iPhone 5/5s');

INSERT INTO #a
VALUES('Model: iPhone 6');

INSERT INTO #a
VALUES('Size: 2X-Large');

INSERT INTO #a
VALUES('Size: Large');

INSERT INTO #a
VALUES('Size: Medium');

INSERT INTO #a
VALUES('Size: Medium / Small');

INSERT INTO #a
VALUES('Size: Small');

INSERT INTO #a
VALUES('Size: XL');

INSERT INTO #a
VALUES('Size: X-Large');

INSERT INTO #a
VALUES('Size: X-Large / Large');

SELECT Model AS Variant_Model,
       CASE
           WHEN size = 'L'
           THEN 'Large'
           WHEN size = 'M'
           THEN 'Medium'
           WHEN size = 'S'
           THEN 'Small'
           WHEN size = 'XL'
           THEN 'X-Large'
           WHEN size = 'XXL'
           THEN '2X-Large'
           ELSE size
       END AS Variant_Size,
       COALESCE(color, Colour) AS Variant_Color
FROM
(
    SELECT id,
           LEFT(REPLACE(REPLACE(CAST(T2.Loc.query('.') AS    VARCHAR(255)), '<X>', ''), '</X>', ''), CHARINDEX(':', REPLACE(REPLACE(CAST(T2.Loc.query('.') AS VARCHAR(255)), '<X>', ''), '</X>', ''))-1) AS header,
           REVERSE(LEFT(REVERSE(REPLACE(REPLACE(CAST(T2.Loc.query('.') AS VARCHAR(255)), '<X>', ''), '</X>', '')), CHARINDEX(':', REVERSE(REPLACE(REPLACE(CAST(T2.Loc.query('.') AS VARCHAR(255)), '<X>', ''), '</X>', '')))-2)) AS Value
    FROM
    (
        SELECT ROW_NUMBER() OVER(ORDER BY AttributeDescription) AS id,
               CAST(('<X>'+REPLACE(REPLACE(AttributeDescription, '<br />', ','), ',', '</X><X>')+'</X>') AS XML) AS String
        FROM #a
    ) T
    CROSS APPLY String.nodes('/X') AS T2(Loc)
) data PIVOT(MAX(value) FOR header IN(Color,
                                      Size,
                                      Model,
                                      Colour)) p;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM