【问题标题】:How to search a like statement with expanding characters如何使用扩展字符搜索类似语句
【发布时间】:2020-11-19 13:26:23
【问题描述】:

我有一个来自 sys 表的 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,但认为这可能是关键的一部分。而且,不幸的是,我什至无法弄清楚该谷歌帮助看看是否还有其他类似的问题。

我可以控制的:

  • #assignments 表
  • 用于分配的查询

我无法控制的:

  • #origin 表,因为它完全基于 sys 表中的对象名称,并且在此处显示为临时表以简化代码

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

【问题讨论】:

    标签: sql-server tsql ssms sql-server-2016


    【解决方案1】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      相关资源
      最近更新 更多