我在MSSQL表(TableB)中有数据,其中[dbo] .tableB.myColumn在特定日期之后更改格式...
我正在做一个简单的加入那张桌子..
Select [dbo].tableB.theColumnINeed from [dbo].tableA left outer join [dbo].tableB on [dbo].tableA.myColumn = [dbo].tableB.myColumn
但是,我需要使用不同的格式加入,基于表A中的日期列([dbo] .tableA.myDateColumn).
就像是...
Select [dbo].tableB.theColumnINeed from [dbo].tableA left outer join [dbo].tableB on [dbo].tableA.myColumn = IF [dbo].tableA.myDateColumn > '1/1/2009' BEGIN FormatColumnOneWay([dbo].tableB.myColumn) END ELSE BEGIN FormatColumnAnotherWay([dbo].tableB.myColumn) END
我想知道是否有办法做到这一点..或者更好的方式我不想考虑这个...
SELECT [dbo].tableB.theColumnINeed FROM [dbo].tableA LEFT OUTER JOIN [dbo].tableB ON [dbo].tableA.myColumn = CASE WHEN [dbo].tableA.myDateColumn <= '1/1/2009' THEN FormatColumnOneWay([dbo].tableB.myColumn) ELSE FormatColumnAnotherWay([dbo].tableB.myColumn) END
您可以考虑使用UNION,而不是在JOIN中使用CASE语句来阻止使用索引进行查询
SELECT [dbo].tableB.theColumnINeed FROM [dbo].tableA LEFT OUTER JOIN [dbo].tableB ON [dbo].tableA.myDateColumn > '1/1/2009' AND [dbo].tableA.myColumn = FormatColumnOneWay([dbo].tableB.myColumn) UNION ALL SELECT [dbo].tableB.theColumnINeed FROM [dbo].tableA LEFT OUTER JOIN [dbo].tableB ON [dbo].tableA.myDateColumn <= '1/1/2009' AND [dbo].tableA.myColumn = FormatColumnAnotherWay([dbo].tableB.myColumn)
但是如果FormatColumnOneWay/FormatColumnAnotherWay是函数或字段表达式,可能会在[myColumn]上排除使用inxdexes,尽管myDateColumn上的任何索引仍然应该被使用
但是,它可能有助于理解FormatColumnOneWay/FormatColumnAnotherWay逻辑是什么,因为已知可以实现更好的优化
有几点需要注意:
UNION ALL不会删除任何重复项(与UNION不同).因为这两个子查询是互斥的,所以这是可以的,并保存UNION将使其能够删除重复项的SORT步骤.
您不应该使用'1/1/2009'样式作为字符串日期,您应该使用'yyyymmdd'样式而不使用斜杠或连字符(您也可以使用带参数的CONVERT来明确指示字符串是否为d/m/y或m/d/y样式