是否可以加入动态?取决于列的内容?

Is it possible to join dynamic ? Depending on the content of a column?

我正在使用此联接从 tblChassis 检索行,其中 temp.ChassisNumber 匹配 ch.ChassisNumber

虽然这有效,但速度很慢。

速度慢的原因是 like '%'

select ...
from @TempTable temp
left join tblChassis ch on ch.ChassisNumber like '%' + temp.ChassisNumber + '%'

我必须使用 like,因为有时我无法获得完整的搜索值。

这是如何工作的,用户将 chassis numbers 的列表放在表单上,​​然后该表单会在 table 中查找底盘编号。有时会有完整的底盘编号(长度 = 17),但有时他们没有,只有一部分。这部分可以是最后xx位,也可以是前xx位,也可以是中间的一些数字。
当然,有时他们会混合使用。

所以我做的是制作一个临时文件 table declare @TempTable (ChassisNumber varchar(17)) 并用用户在表格中输入的所有底盘编号填充它。

然后我可以从这个 table select 加入我需要的所有其他 table。

declare @TempTable table(ChassisNumber varchar(17))

insert into @TempTable 
values ('WF0EXXTTREMG4210'),
       ('WF0JXXWPCHMB28874'),
       ('WF0JXXWPCHMB'),
       ('MB28874')
  
select ...
from @TempTable temp
left join tblChassis ch on ch.ChassisNumber like '%' + temp.ChassisNumber + '%'

所以现在我试图让查询执行得更快一些,我想知道是否有办法使连接动态化,这样我就可以在底盘号不是 17 时使用 like数字,当底盘号有 17 位时使用 =

当连接为 ch.ChassisNumber = temp.ChassisNumber 时,查询速度如此之快,我什至无法衡量它。

这样的事情可能吗?

例如这个伪代码(不是正常工作而是给出我正在寻找的想法)

on case 
       when len(temp.ChassisNumber) = 17 
           then ch.ChassisNumber = temp.ChassisNumber
       else ch.ChassisNumber like '%' + temp.ChassisNumber + '%'
   end

编辑

我想我可以先加入 temptable 中底盘编号为 17 位的所有行,然后 union 查询所有其他行。

这会有所帮助,但我希望有更好的东西。

我认为 Stu says in there 有一些优点,但是,我想补充一点。虽然这是一个 table 变量,但我建议在 table 中添加一个计算列,然后你可以像下面这样进行过滤。这意味着 如果 table 中的所有行的长度为 17 那么底部查询应该被“掩盖”为 WHERE将过滤掉变量中的所有行:

DECLARE @TableVariable table (ChassisNumber varchar(17),
                              ChassisNumberLen AS LEN(ChassisNumber) PERSISTED);

INSERT INTO @TableVariable (ChassisNumber)
VALUES ('WF0EXXTTREMG4210'),
       ('WF0JXXWPCHMB28874'),
       ('WF0JXXWPCHMB'),
       ('MB28874');

SELECT *
FROM @TableVariable;

SELECT {YourColumns}
FROM @TableVariable TV
     LEFT JOIN dbo.tblChassis CH ON TV.ChassisNumber = CH.ChassisNumber
WHERE TV.ChassisNumberLen = 17
UNION ALL
SELECT {YourColumns}
FROM @TableVariable TV
     LEFT JOIN dbo.tblChassis CH ON CH.ChassisNumber LIKE '%' + TV.ChassisNumber + '%'
WHERE TV.ChassisNumberLen < 17; --I assume they can't be longer than 17