我写了一个如下查询:
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语句以最小化执行时间?
答案 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个可能的值,则无法对其进行索引。