首页 > 解决方案 > 如何加入不同的 CONCAT 表达式?

问题描述

我正在尝试根据CONCAT包含不同文本条件的表达式连接表。

我尝试了一种效率低下的方法,查询时间太长。

SELECT 
sf.displayId, 
-- tw.displayText,
CASE
        WHEN tw.DisplayText IN ('N/A', 'NotApplicable', 'Not Applicable')
        THEN 'Not Applicable'
        ELSE REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(tw.DisplayText,'client','Client'),'approved','Approved'),'rejected','Rejected'),'review','Review'),'Requirement','Requirement'),'open','Open'),'submitted','Submitted'),'complete','Complete'),'incomplete','Incomplete'),'pending','Pending'),'resubmit','Resubmit'),'Awaiting review','Awaiting Review')
        END AS AuditStatus
FROM Connect.Data.supplier_form sf
JOIN Connect.Data.translation tw 
     ON ((CONCAT('workflowStepName' , sf.workflowStatusId) = tw.translationField) OR (CONCAT('workflowStepMessage' , sf.workflowStatusId) = tw.translationField))
     AND tw.language = 'en'
WHERE sf.deleted = 0
AND tw.displayText IN ('Awaiting Review','Awaiting review')
ORDER BY sf.displayId
OFFSET 0 ROWS
FETCH NEXT 100 ROWS ONLY;

我想以一种更有效Connect.Data.supplier_form sf的方式基于表达式加入。CONCAT

标签: sqlsql-server

解决方案


我不确定 SQL 优化器在 SQL Server 中有多好,因此您可以尝试翻转连接条件的顺序以更容易使用索引。我会做两件事:

  • 我会将JOIN条件更改为:

    JOIN Connect.Data.translation tw 
    ON tw.language = 'en'
    AND tw.translationField in (
      CONCAT('workflowStepName' , sf.workflowStatusId),
      CONCAT('workflowStepMessage' , sf.workflowStatusId)
    )
    
  • 我会添加索引:

    create index ix1 on Connect.Data.translation(language, translationField);
    

试一试,让我们知道它是否能提高性能。


推荐阅读