where子句中的字符串连接

Mic*_*l A 2 sql t-sql database sql-server-2008

我昨天发布了以下问题:where子句中的多个'in'语句需要相互匹配

在这里有一些关于Oracle中的一个功能的讨论在Microsoft SQL中不存在,具体的代码行是:

where (suite_id,lease_id) in (('CCBG08','205059'),('CCBG14','152424'),('CCCF048','150659'))
Run Code Online (Sandbox Code Playgroud)

假设我们有一个表(但有更多行):

suite_id lease_id

CCBG08 150659

CCBG14 152424

我在此推断为Microsoft SQL创建以下解决方案:

select  *
from    property.lease_period
where   (suite_id + ' ' + lease_id) 
        in (
            ('CCBG08 205059'),
            ('CCBG14 152424'),
            ('CCCF048 150659')
        )
Run Code Online (Sandbox Code Playgroud)

不幸的是,做这样的事情对性能的影响是非常显着的(因为没有使用索引).我想知道如何改进这个?

Jak*_*sel 8

大概我们在这里讨论动态生成的SQL,对吧?那么,在这种情况下,为什么不使用长形式:

select  *
from    property.lease_period
where
(suite_id = 'CCBG08' AND lease_id = '205059') OR 
(suite_id = 'CCBG14' AND lease_id = '152424') OR 
(suite_id = 'CCCF048' AND lease_id = '150659')
Run Code Online (Sandbox Code Playgroud)

编辑 重新阅读原始帖子,我看到这基本上是你开始的,并希望避免.考虑到这一点,您可以通过创建property.lease_period的视图,将您发布的方法(字符串连接值)与索引一起使用,并在该视图中包含计算列(例如,suite_id +''+ lease_id为suite_lease).最后,在该列上为该视图创建索引.然后更改代码以从此新视图和列中进行选择,而不是从基表中进行选择.