Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql where子句中的字符串连接_Sql_Database_Sql Server 2008_Tsql - Fatal编程技术网

Sql where子句中的字符串连接

Sql where子句中的字符串连接,sql,database,sql-server-2008,tsql,Sql,Database,Sql Server 2008,Tsql,我昨天发布了以下问题: 在本文中,我们讨论了Oracle中的一项功能,该功能在Microsoft SQL中不存在,具体代码行如下: where (suite_id,lease_id) in (('CCBG08','205059'),('CCBG14','152424'),('CCCF048','150659')) 假设我们有一个表(但是有更多行): 套房号租赁号 CCBG08 150659 CCBG14 152424 在此基础上,我为Microsoft SQL创建了以下解决方案: select

我昨天发布了以下问题:

在本文中,我们讨论了Oracle中的一项功能,该功能在Microsoft SQL中不存在,具体代码行如下:

where (suite_id,lease_id) in (('CCBG08','205059'),('CCBG14','152424'),('CCCF048','150659'))
假设我们有一个表(但是有更多行):

套房号租赁号

CCBG08 150659

CCBG14 152424

在此基础上,我为Microsoft SQL创建了以下解决方案:

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

不幸的是,这样做对性能的影响非常显著(因为没有使用索引)。我想知道如何改进这一点?

我会咬紧牙关,明确地说出OR条件:

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')

大概我们在这里讨论的是动态生成的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')
编辑
重新阅读您的原始线程,我看到这基本上是您开始时希望避免的。考虑到这一点,您可以通过创建property.lease\u period的视图,将发布的方法(字符串连接值)与索引一起使用,并在该视图中包含一个计算列(例如,suite\u id+“”+lease\u id as suite\u lease)。最后,在该列上为该视图创建索引。然后将代码更改为从此新视图和列中选择,而不是从基表中选择。

oracle提供的不正是这一点的一个简短形式吗

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') or

如果这不太正确,很抱歉,我的sql有点生疏。

您可以使用临时表/表变量的联接,这可能是一种更简洁的方式,具体取决于您的场景/组合数量:

DECLARE @data TABLE (suite_id VARCHAR(10), lease_id VARCHAR(10))
INSERT @data VALUES('CCBG08', '205059')
INSERT @data VALUES('CCBG14', '152424')
INSERT @data VALUES('CCCF048', '150659')

select  l.*
from    property.lease_period l
    JOIN @data d ON l.suite_id = d.suite_id AND l.lease_id = d.lease_id

不要忘记使用cte的解决方案;)


我看不出有什么意义(我更喜欢上面的答案,我也投了更高的票),但由于您(为了教育起见)要求使用串联的版本,下面的代码将比您问题中的代码快,因为它将利用其中一列的索引

select  *
from    property.lease_period
where  
      suite_id in ('CCBG08', 'CCBG14', 'CCCF048')
      AND
      (suite_id + ' ' + lease_id) 
        in (
            ('CCBG08 205059'),
            ('CCBG14 152424'),
            ('CCCF048 150659')
        )

您可以将
WHERE
子句的特定条件转换为如下连接:

SELECT
…
FROM property.lease_period p
  INNER JOIN (
    VALUES ('CCBG08','205059'), ('CCBG14','152424'), ('CCCF048','150659')
  ) x (suite_id, lease_id)
  ON p.suite_id = x.suite_id AND p.lease_id = x.lease_id

你能把它变成一个计算列并索引它吗@MikeChristensen潜在地,我没有考虑到这一点。也许写出来会更好,就像每个比我聪明的人已经建议的那样:)为了教育起见,你如何在仍然使用索引的情况下实现上述目标?如果你的索引同时包含suite_id和lease_id,然后它会被使用。套件id和租赁id没有索引吗?如果不是的话,你能创建它吗?对不起,上面我指的是问题中的原始代码。我实际上是从你们这里所拥有的东西开始的,但我希望通过教育的连接来解决这个问题sake@MattH嗯,一分二十四秒,但谁在数呢?;-)这适用于SQL Server 2008。但是,在SQL Server中仍然没有
WHERE(x.suite\u id,x.lease\u id)=(p.suite\u id,p.lease\u id)
。@ypercube:没有,没有元组比较,这很遗憾。我想我已经在MS Connect上看到了相应的请求,尽管我不确定。
SELECT
…
FROM property.lease_period p
  INNER JOIN (
    VALUES ('CCBG08','205059'), ('CCBG14','152424'), ('CCCF048','150659')
  ) x (suite_id, lease_id)
  ON p.suite_id = x.suite_id AND p.lease_id = x.lease_id