2016-08-30 62 views
1

我有一列有一些單值和逗號分隔的值,我想通過匹配到說明表來替換它們。替換可能包含csv的列中的文本值

我有一個表,看起來像這樣:

enter image description here

文本表示:

Length Directory                Extensions    Extension Description Type 
6684672 Y:\Data\Retail\WalmartMX\Development\Curt.Wolfe\ChristiesAnalysisTool accdb accdb    Access Database Development/DB 
2002944 Y:\Data\Retail\WalmartMX\Development\SourceCode\WalmartMxDecipher\APPS ACCDB accdb    Access Database Development/DB 
5312512 Y:\Data\Retail\WalmartMX\Development\SourceCode\AnalysisTool    accdb accdb    Access Database Development/DB 
30986240 Y:\Data\Retail\WalmartMX\Utilities\Tracking\Stats\BAK     accdb accdb    Access Database Development/DB 
112917071 Y:\Data\Retail\WalmartMX\Deploy\Development\SourceCode\WalmartMxDecipher accdb,accde,zip   NULL NULL NULL 
139053182 Y:\Data\Retail\BQ\Utilities\EMT           accdb,bat,docx,laccdb,txt NULL NULL NULL 
32116006 Y:\Data\Retail\WalmartMX\Utilities\Tracking\Stats      accdb,bat,laccdb,sql,xlsx NULL NULL NULL 

我需要更換價值的擴展字段或更好,但創建一個新的字段具有來自另一個表格的描述的列表。

  1. 匹配的擴展名(可以用逗號隔開需要他們全部)
  2. 提供一個新的領域與描述
    一個。新字段應該(如果擴展名是accdb)是Access數據庫(從另一個表匹配)
    b。如果CSV應改爲(如果擴展TXT,XML)CSV文件,文本文件(再次從另一個表匹配的擴展字段)

預期輸出: enter image description here

到目前爲止的代碼:

SELECT * 
    FROM [SandboxVinny].[dbo].[FinalDirectoryListing] FDL 
    left JOIN dbo.SourceExtensions SE 
    on SE.Extension = FDL.Extensions 

很明顯,使用這個我得到空字段中有多個文件擴展名的任何行的空值。

+1

請檢查此鏈接如何改善問題..https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ – TheGameiswar

+0

更新顯示我的來源(文字表示)和我的預期輸出。 – VinnyGuitara

回答

2

如何解決:

  1. 你需要每行的唯一標識符。

  2. 創建ROWID和延伸柱另一個表

  3. 填充該表具有一對多爲每個分機(所以如果rowid從1到7中的例子表是這樣的:

    ID Extension 1 accdb 2 ACCDB 3 accdb 4 accdb 5 accdb 5 accde 5 zip 6 accdb 6 bat 6 docx 6 laccdb 6 txt 7 accdb 7 bat 7 laccdb 7 sql 7 xlsx

  4. 現在你的數據是關係 - 你可以做的查詢,並加入到這個新表中,然後加入到你的「其他表」

1

即使您發佈了一些(部分)截圖,也很難猜測您想要做什麼。

由於Hogan mentioned,數據很難查詢,因爲它的結構是不相關的。然而,這是可能的。就像這樣:

SELECT *, 
STUFF((SELECT ', ' + se.Description AS [text()] 
     FROM SourceExtensions AS se 
     WHERE ',' + fdl.Extensions + ',' LIKE '%,' + se.Extension + ',%' 
     FOR XML PATH('')), 1, 2, '') AS Description 
FROM FinalDirectoryListing AS fdl 

這種複雜FOR XML招用子查詢的aggregating strings by concatenation的SQL Server的方式。 LIKE在逗號分隔列表中找到單獨的擴展名。 STUFF(..., 1, 2, '')最終在第一個元素之前刪除

這是你在找什麼?

+0

這確實沒有幫助,因爲他需要解析逗號分隔的列表並使用它來加入 - 您的示例允許組合 - 基本上,您顯示的是相反的情況。 – Hogan

+0

我想你更瞭解OP的問題。這只是我閱讀它的方式。 'WHERE','+ fdl.Extensions +','LIKE'%,'+ se.Extension +',%''部分解析逗號分隔的列表並且也在'JOIN'中工作。 –

+0

這不起作用,你也只能在逗號​​之前逗號,逗號只在之後,沒有逗號。很多情況下。更好地完成我所說的話並製作一個過程來製作一份可以添加索引的列表。 – Hogan