如何在SQL查询(sql server)中的JOIN中放入IF语句

时间:2014-12-23 00:34:55

标签: sql sql-server sql-server-2008

我有这个查询,我得到每个范围的两个值(CurrentValue和NextValue)之间的所有寄存器,就是当我到达最后一个值时......没有NextValue来获取寄存器为当前价值这样的东西

CV       NV
10245<-->10369 = (10263,10333,10357)
10963<-->11052 = (10964,11000,11022)
11300<-->"NoNextValue" = (Still needing the Values after 11300)

我想知道的是如果有一种方法可以在JOIN中将ON语句放入ON比较中

我有这个

WITH CTE AS 
(
rownum = ROW_NUMBER() OVER (ORDER BY mif.Row1),
*
FROM DispatchFianzas.dbo.MisFianzas mif
)

SELECT c.*
FROM (SELECT * FROM (SELECT b.*, CTE.FolioTrip as CurrentValue, nex.FolioTrip as NextValue
  FROM UltraTrips.dbo.Bails b
  LEFT JOIN  CTE ON CTE.bail = b.bail
  LEFT JOIN  CTE nex  ON nex.rownum  = CTE.rownum + 1 
  )a
  LEFT JOIN  DispatchBails.dbo.Trips t 
  ON t.trip  BETWEEN a.CurrentValue AND a.NextValue ) c

你可以在最后一行看到&#34;关于a.CurrentValue和a.NextValue&#34;的关系。我用这个来制作JOIN,但我想要像这样的东西

ON IF(a.NextValue IS NOT NULL)
   BEGIN
   t.trip  BETWEEN a.CurrentValue AND a.NextValue
   END
   ELSE
   t.trip > a.CurrentValue 

,所以...你能告诉我这样做的方法吗?谢谢

2 个答案:

答案 0 :(得分:0)

不要认为你可以在联接中使用case语句,你需要使用OR。

ON
(a.NextValue is not null 
and
t.trip  BETWEEN a.CurrentValue AND a.NextValue)
or
t.trip > a.CurrentValue 

答案 1 :(得分:0)

以下Case子句可用于替换您编写的IF语句,并且对SQL

有效
On 1 = CASE WHEN a.NextValue IS NOT NULL 
                 AND t.trip between a.CurrentValues AND a.NextValue THEN 1
            WHEN a.NextValue IS NULL AND t.trip > a.CurrentValue THEN 1
            ELSE 0 
       END

只需检查选择的性能,因为我不确定它对索引的表现如何。