SELECT Query中的Case语句

时间:2014-10-09 19:19:01

标签: sql sql-server

我写了一个如下查询:

SELECT * FROM Table1
LEFT JOIN Table2  
      ON Table2.field1 LIKE CASE WHEN Table2.field2= 1 
                                 THEN  Table1.field1 
                                 WHEN Table2.field2 = 2 
                                 THEN Table1.field1 + '%' 
                            END

查询占用了太多的执行时间。在检查计划时,我发现由于匹配而花费的时间。如何在SELECT中重写CASE语句以最小化执行时间?

3 个答案:

答案 0 :(得分:1)

我会尝试使用此连接:

SELECT
  *
FROM
  Table1 LEFT JOIN Table2  
  ON
    (Table2.field2=1 AND Table2.field1=Table1.field1)
    OR
    (Table2.field2=2 AND Table2.field1 LIKE Table1.field1 + '%')

答案 1 :(得分:0)

是否需要像?你可以改用equals吗?在这种情况下,您可以使用子字符串或其他内容作为第二种情况的一部分来创建当前检查的psudo版本。它看起来像这样

SELECT * FROM Table1
LEFT JOIN Table2  
  ON Case WHEN Table2.field2= 1 
          Then Table2.field1 = Table1.field1
          When Table2.field2 = 2
          Then Substring(Table2.field1, 1, Len(Table1.field1)) = Table1.Field1
     END

如果这样做会有效,可能会有点不确定,主要是因为缺少其他情况。

答案 2 :(得分:0)

我会尝试以下查询:

SELECT * 
  FROM Table1
  LEFT JOIN Table2  
    ON Table2.field1 = Table1.field1
WHERE Table2.field2 = 1 
UNION ALL
SELECT * 
  FROM Table1
  LEFT JOIN Table2  
    ON Table2.field1 LIKE Table1.field1 + '%'
WHERE Table2.field2= 2 

确保将field1编入索引。如果field2只有2个可能的值,则无法对其进行索引。