如何使用扩展字符搜索类似语句
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 帮助看看是否还有其他类似的问题。
我能控制的:
- #assignments table
- 用于分配的查询
我无法控制的事情:
- #origin table 因为它完全基于 sys tables 中的对象名称,并且只是作为临时 table 在这里呈现以简化代码
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
我有一个来自 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 帮助看看是否还有其他类似的问题。
我能控制的:
- #assignments table
- 用于分配的查询
我无法控制的事情:
- #origin table 因为它完全基于 sys tables 中的对象名称,并且只是作为临时 table 在这里呈现以简化代码
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