在喜欢的联接上使用CASE

时间:2019-02-26 19:11:13

标签: sql sql-server case sql-like

我想在tblAssets上结合使用CASE语句和LIKE LEFT JOIN。我在case语句的LIKE之后使用THEN遇到麻烦。下面,我有两个有效的单独查询。我需要像在第二个查询中一样,将第一个查询用于多种情况,但是当它们彼此相似时就加入。能做到吗?

第一个查询

SELECT tblAssets.AssetName, tblDBFeedImport.DEAL_SRC_NAME
FROM tblDBFeedImport
LEFT JOIN tblAssets 
ON tblDBFeedImport.DEAL_SRC_NAME LIKE + '%' + tblAssets.AssetName + '%'

第二个查询

SELECT DISTINCT tblAssets.AssetID, tblAssets.AssetName, tblAssets.LS2Name, tblDBFeedImport.DEAL_SRC_NAME, tblDBFeedImport.FACILITY_NAME, tblAssets.PipelineStatusID
FROM tblDBFeedImport

LEFT JOIN tblAssets
ON tblDBFeedImport.DEAL_SRC_NAME = 
CASE
    WHEN tblAssets.AssetName LIKE '%' + tblDBFeedImport.DEAL_SRC_NAME + '%' THEN tblAssets.AssetName
    WHEN tblAssets.LS2Name LIKE '%' + tblDBFeedImport.DEAL_SRC_NAME + '%' THEN tblAssets.LS2Name
    END

WHERE 1=1
AND tblAssets.PipelineStatusID=6
ORDER BY tblAssets.AssetName, tblDBFeedImport.DEAL_SRC_NAME, tblAssets.LS2Name

1 个答案:

答案 0 :(得分:2)

您还可以使用CASE生成一个数字,然后检查该数字。

SELECT DISTINCT 
 ass.AssetID, ass.AssetName, ass.LS2Name, 
 imp.DEAL_SRC_NAME, imp.FACILITY_NAME, 
 ass.PipelineStatusID
FROM tblDBFeedImport imp
LEFT JOIN tblAssets ass
ON CASE
   WHEN ass.AssetName LIKE '%' + imp.DEAL_SRC_NAME + '%' THEN 1
   WHEN ass.LS2Name LIKE '%' + imp.DEAL_SRC_NAME + '%' THEN 2
   ELSE 0
   END > 0
WHERE ass.PipelineStatusID = 6
ORDER BY ass.AssetName, imp.DEAL_SRC_NAME, ass.LS2Name

但是为此使用OR可能会更快

...
LEFT JOIN tblAssets ass
ON (   ass.AssetName LIKE '%' + imp.DEAL_SRC_NAME + '%' 
    OR ass.LS2Name LIKE '%' + imp.DEAL_SRC_NAME + '%')
...