2016-08-30 61 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