如何使用扩展字符搜索类似语句

How to search a like statement with expanding characters

我有一个来自 sys tables 的 sql 对象的列表,假设其中大约有 14,000 个,我需要确定应该分配哪个团队来审查它们以进行数据规范化项目。我们还将在未来实施正确的命名约定。目前,它没有正确实施,因此导致我面临的问题。

给定以下示例:

drop table if exists #origin;

create table #origin ( objectName varchar (40) not null );

insert into #origin ( objectName )
values ( 'FoTacoTruck' )
     , ( 'FooHappyForest' )
     , ( 'gseBAN' )
     , ( 'gse_dt_Primer' )
     , ( 'gse_sparkles' );

drop table if exists #assignments;

create table #assignments ( objectPrefix varchar (10) not null, team_name varchar (20) not null );

insert into #assignments ( objectPrefix, teamName )
values ( 'Fo', 'Team Edward' )
     , ( 'Foo', 'Team Jacob' )
     , ( 'gse', 'Team Steve' )
     , ( 'gse_dt', 'Team Sabrina' );

select o.objectname
     , a.team_name
from #assignments a
join #origin      o on o.objectName like ( concat( a.objectPrefix, '%' )); 

目前,这会产生以下结果:

objectName     | teamName
=================================
FoTacoTruck    | Team Edward
FooHappyForest | Team Edward
FooHappyForest | Team Jacob
gseBan         | Team Steve
gse_dt_Primer  | Team Steve
gse_sparkles   | Team Steve
gse_dt_Primer  | Team Sabrina

由于使用了通配符,我很难弄清楚如何使名称起作用。目前,这些对象并没有全部使用 ObjectPreFix_ 名称,它们将在未来使用,允许我使用 charindex 或 regex 来解析。

我不能子串,因为字符数量并不总是正确的...我不能使用 charindex,因为并不总是有一个分隔符可供参考...我还没有弄清楚如何使用任何 patindex,但认为这可能是关键的一部分。而且,不幸的是,我什至不知道要 google 帮助看看是否还有其他类似的问题。

我能控制的:

我无法控制的事情:

Tl;DR:当没有可识别的(我)模式时,如何让 objectPrefix 与 objectName 匹配?

这里似乎有一个隐含的规则:前缀越详细(a.k.a。更长),它在与团队名称匹配时的优先级就越高。所以像你一直在做的那样匹配,但是当有多个匹配时,取使用最长前缀匹配的那个:

with prefixMatches as (

    select      o.objectname, 
                a.team_name,
                ord = row_number() over(
                    partition by o.objectName 
                    order by len(a.objectPrefix) desc
                )
    from        #assignments a
    join        #origin o on o.objectName like a.objectPrefix + '%'

)

select      objectName,
            team_name
from        prefixMatches
where       ord = 1