【问题标题】:SQL Select help - removing white spaceSQL Select 帮助 - 删除空格
【发布时间】:2009-09-07 02:44:32
【问题描述】:

我在尝试从我的 2005 MS-SQL 数据库中选择记录时遇到了问题(我对 SQL 还是很陌生,但我已经从 w3schools 学习并使用了基本命令)。理论上,我所有的制造商记录都应该是唯一的。至少当我第一次将大量数据转储到其中时,我打算这样做。不幸的是,事实并非如此,现在我需要修复它!这是我的场景:

Table name = ItemCatalog
Relevant columns = Partnumber,Manufacturer,Category

当我执行SELECT DISTINCT Manufacturer FROM ItemCatalog 时,出现了这个小问题:

Cables2Go
CablesToGo
外接电缆
CableToGo Inc
CablesToGo Inc

所有 5 个都显示为不同的,它们是。不能因为返回它而责备我的 SELECT 语句,但从我人类的角度来看,它们都是同一制造商!我看到的一种方法是执行 UPDATE 命令并修复所有出现的排列,但我有很多制造商,这将非常耗时。

当我输入 SELECT 语句时,有没有一种方法可以找到制造商名称(或任何字段)的所有可能排列?我尝试了 LIKE 运算符,所以我的语句会显示为

SELECT Manufacturer FROM ItemCatalog WHERE Manufacturer LIKE '%CablesToGo%'

但结果并没有我希望的那么好。这是令人讨厌的一点,我正在组合的另一个程序绝对要求我只要求一个制造商名称,而不是所有 5 个变体。也许我在这里说的是圈子,但是在一个语句中是否有一种简单的方法可以让我找到类似的字符串?

【问题讨论】:

    标签: sql select wildcard


    【解决方案1】:

    如果你正在做一些数据挖掘,你也可以试试 SQL Server 中的SOUNDEXDIFFERENCE 函数。

    虽然它们都已经过时(它们不能很好地处理外来字符),但它们可以为您带来一些有趣的结果:

    SELECT * FROM ItemCatalog WHERE SOUNDEX(Manufacturer) = SOUNDEX('Cables To Go');
    

    SELECT * FROM ItemCatalog WHERE DIFFERENCE(Name, 'Cables To Go') >= 3;
    

    数字 3 表示可能相似(0 表示不相似,4 表示非常相似)

    互联网上有一些更好的SOUNDEX 功能。示例见Tek-Tips

    这是SQL Team 的另一个示例。

    【讨论】:

      【解决方案2】:

      标准 SQL 有一个 SIMILAR 语句,它比 LIKE 更强大一点。

      但是,您可以使用 LIKE 来获得良好的效果:

      Manufacturer LIKE 'Cable%Go%'
      

      这适用于这种特定情况,查找列出的所有变体。但是,它也会找到“Cable TV Gorgons”,您可能不需要包含它们。您的版本还会找到“We Hate CablesToGo With Ferocity Inc”,您可能也不想要。

      但是,数据清理是一个主要问题,有些公司以提供数据清理为生。您通常最终会制作字典或术语词典(此处为公司名称),将遇到的所有变体映射到规范形式。问题是有时您会发现相同的变体拼写用于两种不同的规范形式。例如,一对明亮的火花可能都决定使用“C2G”作为缩写,但其中一个将其用于“Cables To Go Inc”,另一个将其用于“Computers To Gamers Inc”。您必须使用一些其他信息来确定“C2G”的特定实例是指“电缆”还是“计算机”。

      【讨论】:

      • 你知道MS-SQL是否有SIMILAR语句吗?我在任何地方都找不到任何文档,所以我认为这是“否”?恐怕丑陋的数据清理是我所坚持的:(
      • 如果您无法在 MS-SQL 手册中轻松找到它,那么它可能不存在;它是 SQL 标准中实现最少的部分之一(有关标准 SQL 语法,请参阅savage.net.au/SQL)。
      • 并且丑陋的数据清理将是必要的,即使 SIMILAR 提供正则表达式支持而不仅仅是 LIKE。痛苦就在那里。如果有什么安慰的话,我必须这样做一次(好吧,在我开发它的时候,有几十次)将世界各地端口名称的随机拼写错误映射到规范格式。很久以前 Perl 对我来说是不可用的(1991 年?),有一段时间我使用了一个 shell 脚本,将映射文件拆分为单独的部分,这些部分可以通过脑死亡 sed 运行机器。这太糟糕了,所以我最终使用了一个自制程序来做到这一点。
      • 哎呀老鼠,我想它可能会变成这样。我已经开始研究一些简单的 vbscript 东西来尝试为我解决最糟糕的问题。至少我在这里学到了关于键和表结构的非常重要的一课!
      【解决方案3】:

      'Cable%Go%' 可能适用于这种情况,但如果您对其他字符串有其他变体,您可能需要进行大量手动数据清理。

      【讨论】:

      • 它错过了“CableToGo Inc”。去掉“s”就可以了。
      【解决方案4】:

      我建议您使用对象关系映射工具将您的表映射到对象并在其中添加过滤逻辑。

      【讨论】:

        【解决方案5】:

        您可以选择将通配符搜索放宽为 'Cables%Go%' 之类的内容。这在短期内可能会很好,但使用这种方法,您可能会匹配到比您想要的更多的制造商(即,Cables on the Go 等)。

        您还可以将映射表放在一起,将 Cables To Go 的所有变体放入一个组中,您的应用可以查询并规范化您的 ItemCatalog 查询。

        您的另一个选择是引入制造商表。然后,您的 ItemCatalog 表将具有该表的外键,并且仅允许制造商表中的制造商。这将需要对您的 ItemCatalog 表进行一些清理以使其正常工作,假设您希望 Cables to Go 的所有变体都相同。

        【讨论】:

          【解决方案6】:

          我知道其他人建议修复查询 - 我想我会详细说明我的长期解决问题。

          您可以创建另一个表,将每个变体与单个制造商实体相关联。如果我在工作中遇到这种情况(我曾经遇到过),我会很乐意解决它。

          使用主键、名称等创建制造商表。

          使用别名创建一个表 - 只有当您看到没有制造商 ID 的数据(如导入文件)时才需要这些别名。

          修改 ItemCatalog,使其引用制造商表中的主键(即 ManufacturerID 外键)。

          将数据导入 ItemCatalog 时,根据匹配项将 ManufacturerID 外键分配给别名表。如果您的名称与 2 条以上的记录匹配,则标记它们以供人工审核,或者您尝试匹配的不仅仅是制造商名称。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-04-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-15
            • 2017-12-04
            相关资源
            最近更新 更多