【问题标题】:replace text values in a column that may include csv替换可能包含 csv 的列中的文本值
【发布时间】:2017-01-07 01:11:24
【问题描述】:

我有一列包含一些单个值和逗号分隔值,我想通过匹配描述表来替换它们。

我有一张如下所示的表格:

文本表示:

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 数据库(从另一个表匹配)
    乙。如果有 csv,它应该读取(如果扩展名是 txt、xml)CSV 文件、TextFile(再次匹配扩展字段上的另一个表)

预期输出:

到目前为止的代码:

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

显然,使用它我会为字段中具有多个文件扩展名的任何行获取空值。

【问题讨论】:

标签: sql sql-server sql-server-2008 csv


【解决方案1】:

如何解决:

  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. 现在您的数据是关系型的——您可以进行查询并加入这个新表,然后加入您的“其他表”

【讨论】:

    【解决方案2】:

    即使您发布了一些(部分)屏幕截图,也很难猜出您想要做什么。

    作为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, '') 最终删除了第一个元素之前的

    这是你要找的吗?

    【讨论】:

    • 这真的没有帮助,因为他需要解析一个逗号分隔的列表并使用它来加入——你的例子允许聚合一个组——基本上你显示的是相反的。
    • 我猜你更了解 OP 的问题。这只是我阅读它的方式。 WHERE ',' + fdl.Extensions + ',' LIKE '%,' + se.Extension + ',%' 部分解析逗号分隔的列表,也适用于 JOIN
    • 那不行,你还必须考虑逗号之前,逗号之后,没有逗号。很多情况。最好按照我说的做一个过程来制作一个可以添加索引的列表。
    • 这就是',' ++ ',' 的用途。试试看,效果很好。有时无法更改数据生成过程。
    • 好吧,我知道你做了什么...实际上有点可爱。对于小型数据集,它会很好地工作。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2014-03-05
    • 2023-03-11
    相关资源
    最近更新 更多