2012-02-03 2 views
4

Предполагая, что у меня есть следующая таблица:Как проверить, совпадают ли первые пять символов одного поля?

AAAAAA 
AAAAAB 
CCCCCC 

Как я мог обработать запрос, который позволил бы мне знать, что AAAAA и AAAAB похожи (как они разделяют пять символов в строке)? В идеале я хотел бы написать это как запрос, который бы проверял, разделили ли два поля пять символов подряд в любом месте строки, но это выходит за рамки SQL и что-то, что я должен написать в приложение C#?

В идеале запрос будет добавить еще один столбец, который отображает: Similar to 'AAAAA', 'AAAAB'

+0

Как они разделяют пять символов подряд? они разделяют только 4, или вы имеете в виду количество символов? – cctan

+0

Извините, я сделал свой пример плохо (поздно вечером в пятницу). Теперь обновление – Codingo

+0

здесь в пятницу днем, поэтому я остаюсь в СО; @Michael есть вход, используемый для сравнения, или у вас просто есть набор данных и вы хотите сравнить между собой? – cctan

ответ

7

Я предлагаю вам не пытаться нарушать 1nf путем введения многозначный атрибут с.

что SUBSTRING отмечая очень портативный:

WITH T 
    AS 
    (
     SELECT * 
     FROM (
       VALUES ('AAAAAA'), 
        ('AAAAAB'), 
        ('CCCCCC') 
      ) AS T (data_col) 
    ) 
SELECT T1.data_col, 
     T2.data_col AS data_col_similar_to 
    FROM T AS T1, T AS T2 
WHERE T1.data_col < T2.data_col 
     AND SUBSTRING(T1.data_col, 1, 5) 
       = SUBSTRING(T2.data_col, 1, 5); 

Alternativvely:

T1.data_col LIKE SUBSTRING(T2.data_col, 1, 5) + '%'; 
2

Вы можете использовать left сравнить первые пять символов, и вы можете использовать for xml path конкатенировать подобные строки в одну колонку.

declare @T table 
(
    ID int identity primary key, 
    Col varchar(10) 
) 

insert into @T values 
('AAAAAA'), 
('AAAAAB'), 
('AAAAAC'), 
('CCCCCC') 

select Col, 
     stuff((select ','+T2.Col 
       from @T as T2 
       where left(T1.Col, 5) = left(T2.Col, 5) and 
        T1.ID <> T2.ID 
       for xml path(''), type).value('.', 'varchar(max)'), 1, 1, '') as Similar 
from @T as T1 

Результат:

Col  Similar 
---------- ------------------------- 
AAAAAA  AAAAAB,AAAAAC 
AAAAAB  AAAAAA,AAAAAC 
AAAAAC  AAAAAA,AAAAAB 
CCCCCC  NULL 
3

Найдет все матчи, а также те, в середине слова, он не будет хорошо работать на большой таблица

declare @t table(a varchar(20)) 

insert @t select 'AAAAAA' 
insert @t select 'AAAAAB' 
insert @t select 'CCCCCC' 
insert @t select 'ABCCCCC' 
insert @t select 'DDD' 

declare @compare smallint = 5 

;with cte as 
(
select a, left(a, @compare) suba, 1 h 
from @t 
union all 
select a, substring(a, h + 1, @compare), h+1 
from cte where cte.h + @compare <= len(a) 
) 
select t.a, cte.a match from @t t 
-- if you don't want the null matches, remove the 'left' from this join 
left join cte on charindex(suba, t.a) > 0 and t.a <> cte.a 
group by t.a, cte.a 

Результат:

a     match 
-------------------- ------ 
AAAAAA    AAAAAB 
AAAAAB    AAAAAA 
ABCCCCC    CCCCCC 
CCCCCC    ABCCCCC 
Смежные вопросы