簡體   English   中英

SQL從列中提取數據

[英]SQL Extracting Data from Column

尋找一些SQL幫助來從表中的列中選擇特定數據,並以此創建新列。 這是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`

我想將其分為三個列,分別為“ Variant_Model”,“ Variant_Size”和“ Variant_Color”。 最終結果應為:

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|   `

請注意,在原始列中,該屬性可能顯示為“顏色”或“顏色”。

標准化縮寫詞(例如“ L”,“ M”)成適當單詞的加分!

首先十分感謝!

一種方法是這樣的

查詢:

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;

完整的工作腳本

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