【问题标题】:SQL Coldfusion - eliminate the word THE when searching for duplicate namesSQL Coldfusion - 搜索重复名称时消除单词 THE
【发布时间】:2015-09-25 10:19:04
【问题描述】:

我有一个创建可能重复公司列表的流程。问题在于“The ABC Company, Inc.”和“ABC公司”德克萨斯州达拉斯都可能是重复的,但我不会按照我的标准找到它们。如果它们是“the”,我已经消除了前 4 个字符,但如果它们是“Inc.”,我还需要检查正确的 5 个字符。

我有一个创建列名称的视图。前缀“the”被去掉了;

    SELECT     CASE WHEN LEFT(name, 4) = 'The ' THEN RIGHT(name, (len(name) - 4)) ELSE name END AS thename, CASE WHEN CHARINDEX(' ', ltrim(rtrim(Name))) 
                          = 0 THEN ltrim(Name) WHEN CHARINDEX(' ', ltrim(Name)) = 1 THEN ltrim('b') ELSE SUBSTRING(ltrim(Name) + ' x', 1, CHARINDEX(' ', ltrim(Name))) END AS subname, 
                          CHARINDEX(' ', LTRIM(Name)) AS wordcheck, Name, Address_Line_1, City AS Company_City, State AS Company_State, Zip, Area_Code, Phone, Status_Flag, ID, 
                          Not_Dupe_Flag, DUNS, Temp_Check_Dupes_Flag, Parent_Company_Number, Special_Display, 
                          CASE WHEN c.parent_company_number = 0 THEN c.id ELSE c.parent_company_number END AS parent
    FROM         dbo.Companies AS c

然后我在查询中使用该视图来查找重复项;

        <cfquery name="qResults" datasource="#request.dsnlive#" timeout="200">
            SELECT b.ID,
            Thename,
            substring(TheName,1,(CHARINDEX(' ',TheNAME,1))) as subName,
            name,
            b.address_line_1,
            b.zip,
            b.company_state,
            b.company_city,
            b.area_code,
            b.phone,
            b.Special_Display,
            isnull(not_dupe_flag,'False') as not_dupe_flag,
            isnull(Temp_Check_Dupes_Flag,'False') as Temp_Check_Dupes_Flag,
            b.id as bID,
            b.duns
            FROM dbo.vw_Comp_Details_withFirstWord as b
            WHERE isnull(b.status_flag,'') != 'D'
            and b.ID <> #arguments.CompNum#
                and isnull(b.Temp_Check_Dupes_Flag,'False') = 'False'
            <cfif arguments.IncludeDunsOnly eq 0>
                <cfif arguments.FirstWord>
                    AND b.subName = '#arguments.CompanySubName#'
                <cfelse>
                    AND (substring(dbo.KeepAlphaNumCharacters(Thename),1,#val(arguments.WordLength)#) = substring('#arguments.CompanyName#',1,#val(arguments.WordLength)#)
                    or differnce(soundex(Thename),soundex('#arguments.CompanyName#')) > 2)
                </cfif>
                AND (
                ( company_city = '#arguments.City#'
                 AND Isnull(company_city, '') > '' )
                 AND ( b.parent != #val(arguments.Parent)#
                     AND Isnull(b.parent, '0') > 0 )
                     )
                <cfif arguments.IncludeDuns>
                AND (
                ( REPLACE(LTRIM(REPLACE(b.duns, '0', ' ')), ' ', '0') = '#val(arguments.Duns)#'
                 AND REPLACE(LTRIM(REPLACE(b.duns, '0', ' ')), ' ', '0') > ' '
                 AND #val(arguments.Duns)# > 0 )
                    or  REPLACE(LTRIM(REPLACE(b.duns, '0', ' ')), ' ', '0') = ' '
                    )
                </cfif>

            <cfelse>
                and (REPLACE(LTRIM(REPLACE(b.duns, '0', ' ')), ' ', '0') = '#val(arguments.Duns)#')
            </cfif>


        </cfquery>

现在我需要添加代码以去除后缀“Inc.”。但我似乎无法想出最终得到一个包含没有前缀“The”和后缀“Inc.”的名称的列的逻辑。

【问题讨论】:

  • 这是一个很常见的问题。 (使用触发器确保没有两次插入同一家公司。)
  • 太笼统了。我的公司有多个办事处,有些在同一个城市。这并不像听起来那么容易。
  • 数据库引擎是什么?
  • MS SQL 2012 和 Coldfusion 9
  • 下面有几个好主意。我已经测试了它们的变体,但无法找到可行的解决方案。我的数据的不同来源在创建公司名称方面与公司在其法律结构中的不同。到目前为止,一个准解决方案是仅比较前 x 个字符。但是我们必须多次运行才能获得所需的结果。我仍在通过 MS SQL 处理 Juan Carlos 的建议。

标签: sql coldfusion sql-server-2012 coldfusion-9 cfml


【解决方案1】:

我想分享我几天前的 question。这是在 Postgres 中制作的,但我相信你可以找到一个等价的将字符串拆分为你的 rdbms 的行。

您所做的是拆分字符串并删除有问题的字符串,例如 TheInc

SQL Fiddle Demo

| ID |   token |
|----|---------|
|  1 |     The |
|  1 |     ABC |
|  1 | Company |
|  1 |    Inc. |
|  2 |     ABC |
|  2 | Company |
|  2 |    Inc. |
|  3 |     ABC |
|  3 | Company |

然后你走另一条路,加入剩余的strings together postgres 使用string_agg() MSsql 使用XML PATH

【讨论】:

  • 如果您查看我的示例,您可以执行count(token)+ group by token 来检查哪些项目重复多次以确定哪些令牌不相关。在我的应用程序中,我有一张表 descriptor,我在其中放置了不相关的项目
【解决方案2】:

许多可能的方法来做到这一点。考虑一下,如果您希望获得全文索引,则该字段可以搜索相似的名称并消除诸如 the 之类的干扰词。或者您可以使用 SSIS 包进行模糊匹配(这也有助于缩写副拼写整个单词)。或者您可以使用数据质量服务,这可能是您的最佳选择。

https://msdn.microsoft.com/en-us/library/ff877917.aspx

【讨论】:

  • 您好 HLGEM。我想知道你是否有机会看到我关于全文的Question。我知道很笼统,但看起来你在那里有一些经验。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 2021-10-06
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多