我有一个复杂的字符串匹配方案,想要你们的输入。 我有一个名为Customers的表。此表包含字段CustomerName varchar。 专栏中的数据以Mrs. Mrs. Ms.女士为前缀 数据可能是
现在我需要设计一个搜索查询,它以有序的方式返回仅有夫妻行的行。
喜欢从Customer中选择CustomerName ...... 结果需要像
任何想法?
提前感谢您的考虑。
答案 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;