Сложное совпадение строк в SQL-запросе - PullRequest
2 голосов
/ 06 октября 2011

У меня сложный сценарий для сопоставления строк и я хочу, чтобы вы, ребята, внесли свой вклад.У меня есть таблица Named Customers.Эта таблица содержит поле CustomerName varchar.Данные в столбце начинаются с префикса «Миссис Миссис». Данные могут быть

  1. Мистер.Джон Брэди
  2. Г-жаАвраам Ленин
  3. ГоспожаДжон Брэди
  4. Мистер.Майкл Кинг
  5. МиссисНил Томас
  6. МиссисMicheal King

Теперь мне нужно создать поисковый запрос, который будет возвращать мне строки только пар и последовательно.

Мне нравится Select CustomerName из Customer, где ... ??Результат должен быть как

  1. Мр.Джон Брэди
  2. МиссисДжон Брэди
  3. Мистер.Майкл Кинг
  4. МиссисMicheal King

Есть идеи?

Заранее спасибо за внимание.

Ответы [ 3 ]

1 голос
/ 07 октября 2011

Если вы действительно доверяете своим данным, вот решение:

--proof of concept preparation start

declare @YourTable table (name varchar(50))

insert into @YourTable (name) values
('Mr. John Brady'),
('Ms. Abraham Lenin'),
('Mrs. John Brady'),
('Mr. Michael King'),
('Mrs. Neil Thomas'),
('Mrs. Michael King')

--proof of concept preparation end

;with purenames as (
    select name, 
           LEFT(name, CHARINDEX(' ', name, 0)) salutation,
           RIGHT(name, LEN(name) - CHARINDEX(' ', name, 0)) purename
    from @YourTable
)

select p1.name
from purenames p1
inner join purenames p2 
on p1.purename = p2.purename and p1.salutation <> p2.salutation
order by p1.purename, p1.name

Однако, это будет работать идеально, только если первое слово имени ВСЕГДА приветствует вас (помните, вы должны доверять своемуdata).

И, конечно, мне пришлось зафиксировать Mrs. Micheal King в Mrs. Michael King, поэтому чистое имя (без приветствия) должно быть идентичным.

Я упоминал что-то о доверии вашим данным?Что ж, плохая новость в том, что по опыту вы не можете доверять данным.Однако, если у вас есть хорошие данные, вы сможете определить хорошее количество пар.

1 голос
/ 07 октября 2011
declare @T table(Name varchar(25))

insert into @T values
    ('Mr. John Brady'),
    ('Ms. Abraham Lenin'),
    ('Mrs. John Brady'),
    ('Mr. Michael King'),
    ('Mrs. Neil Thomas'),
    ('Mrs. Michael King')

;with C as
(
  select Name, 
         count(*) over(partition by stuff(Name, 1, charindex(' ', Name), '')) as Cnt
  from @T
)    
select Name
from C
where Cnt = 2
0 голосов
/ 07 октября 2011

я сомневаюсь, что это реальное решение для жизни ... но сначала вам нужно нормализовать свои строки.(в традиционном смысле СУБД и / или в строковом смысле)

Я не уверен, что ваши реальные данные настолько чисты, но вы могли бы искать первые ».'последовательность символов, используйте оставшуюся подстроку, затем проверьте равенство на основе этого.

используйте порядок по исходной строке для сопоставления.

...