SQL Query中的复杂字符串匹配

时间:2011-10-06 19:56:48

标签: sql sql-server string sql-server-2008 tuples

我有一个复杂的字符串匹配方案,想要你们的输入。 我有一个名为Customers的表。此表包含字段CustomerName varchar。 专栏中的数据以Mrs. Mrs. Ms.女士为前缀 数据可能是

  1. 先生。约翰布拉迪
  2. 女士。亚伯拉罕·列宁
  3. MRS。约翰布拉迪
  4. 先生。迈克尔·金
  5. MRS。尼尔托马斯
  6. MRS。 Micheal King
  7. 现在我需要设计一个搜索查询,它以有序的方式返回仅有夫妻行的行。

    喜欢从Customer中选择CustomerName ...... 结果需要像

    1. 先生。约翰布拉迪
    2. MRS。约翰布拉迪
    3. 先生。迈克尔·金
    4. MRS。 Micheal King
    5. 任何想法?

      提前感谢您的考虑。

4 个答案:

答案 0 :(得分:1)

如果你真的相信你的数据,这就是解决方案:

--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

但是,只有在名字的第一个单词始终是称呼时才会完美地运行(请记住,您必须信任您的数据)。

当然,我必须将Mrs. Micheal King修复为Mrs. Michael King,因此纯名称(无称呼)必须相同。

我是否提到过信任您的数据?好吧,坏消息是,根据经验,你不能相信数据。但是,如果您有良好的数据,您应该能够识别出大量的夫妻。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我怀疑这是一个真实的解决方案......但你首先需要规范你的字符串。 (在传统的RDBMS意义上,和/或在字符串意义上)

我不太确定你的真实数据是否干净,但你可以寻找第一个'。 '字符序列,使用剩余的子字符串,然后根据它检查相等性。

在原始字符串上使用order by进行整理。

答案 3 :(得分:-1)

  WITH pattern_cnt 
     AS (SELECT string_pattern, 
                Count(string_pattern) AS CNT 
         FROM   (SELECT Substr(NAME, Instr(NAME, '.') + 1) AS STRING_PATTERN 
                 FROM   couples) 
         GROUP  BY string_pattern), 
     string_match 
     AS (SELECT NAME, 
                Substr(NAME, Instr(NAME, '.') + 1) AS PATTERN 
         FROM   couples) 
SELECT a.NAME 
FROM   pattern_cnt b, 
       string_match a 
WHERE  a.pattern = b.string_pattern 
       AND b.cnt > 1; 
相关问题