2015-09-25 3 views
2

У меня есть процесс, который создает список возможных дублирующих компаний. Проблема в том, что «The ABC Company, Inc.» и "ABC Company, Inc." оба в Далласе, штат Техас, вероятно, дублируются, но я не найду их с моими критериями. Я удалил первые 4 символа, если они «есть», но мне также нужно проверить правильные 5 символов, если они «Inc.».SQL Coldfusion - исключить слово THE при поиске дублирующихся имен

У меня есть представление, которое создает столбец thename. Префикс «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.»,

+0

Это довольно распространенная проблема. (Используйте триггеры, чтобы убедиться, что одна и та же компания не вставлена ​​дважды.) – jarlh

+0

Слишком общий. У меня есть компании, которые имеют несколько офисов и некоторые в одном городе. Это просто не так просто, как кажется. – user990016

+0

И двигатель базы данных? –

ответ

2

Я хотел бы поделиться своим question от нескольких дней назад. Это было сделано в Postgres, но я уверен, что вы можете найти эквивалент для разделенной строки в строки для своих rdbms.

Что вы делаете, разделить строку и удалить строку обижая как The или Inc

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, и т.д.

+0

, если вы проверите мой пример, вы можете сделать 'count (токен)' + 'group по токену, чтобы проверить, какой элемент повторяется более одного раза, чтобы решить, какой токен имеет значение. В моем приложении у меня есть таблица 'дескриптор', где я помещаю ненужные элементы –

1

Многие возможные способы сделать это , Подумайте, хотите ли вы, чтобы индекс полного текста выиграл поле, которое затем может искать похожие имена и исключать шумовые слова, такие как. Или вы можете использовать пакет SSIS для выполнения нечеткого соответствия (это также помогло бы с сокращениями, которые написали бы весь текст). Или вы можете использовать службы качества данных, которые, вероятно, лучше всего.

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

+0

Здравствуйте, HLGEM. Интересно, есть ли у вас шанс увидеть мой [** Вопрос **] (http://stackoverflow.com/questions/32619987/full-text-difference-between-sql-server-and-postgres) относительно полного текста. Я знаю, очень общий, но похоже, что у вас есть опыт. –