SQL Server:查询可以一步将结果返回到多部分搜索吗?

时间:2016-03-05 20:02:12

标签: sql sql-server union

假设我们有一个汽车经销商网站,可以搜索品牌,型号,类型和年份。完整的搜索字词将是 Toyota Corolla Sedan 2006 。 “丰田”由主 Cars 表中的简单数字ID键表示,“Corolla”和“Sedan”也是如此。 Make,Model和Sedan的键引用制作模型 Car_Types 表。

查询应首先返回完全匹配,即。所有汽车都是2006年的丰田Corollas。然后同样的问题应该从2006年以后的年份返回Corollas,按相关性递减顺序排列,因此接近2006年将是第一次,然后是更远的几年,然后它将返回其他丰田汽车那不是卡罗拉,但仍然是轿车,最后是其他丰田,既不是卡罗拉也不是轿车。

使用基于搜索参数的UNIONs编写多阶段动态SQL查询是可以容忍的(如果很麻烦),但我不禁觉得有一个优雅的,一步到位的方法来做到这一点。当然,如果没有更好,更明智的方法,那么我可能最终会采用UNION方法:

SELECT * FROM (
  SELECT Car_ID, 1 as ResultOrder FROM Cars 
    WHERE Make_ID = 1 AND Model_ID = 5 AND Car_Type_ID = 7 AND Year = 2006
  UNION
  SELECT Car_ID, 2 as ResultOrder FROM Cars 
      WHERE Make_ID = 1 AND Model_ID = 5 AND Car_Type_ID = 7    
  UNION
  SELECT Car_ID, 3 as ResultOrder FROM Cars 
      WHERE Make_ID = 1 AND Car_Type_ID = 7
  UNION
  SELECT Car_ID, 4 as ResultOrder FROM Cars 
      WHERE Make_ID = 1
  ) AS Results
ORDER BY ResultOrder

感觉笨重。它不够优雅。如果你能建议一个更健全,更高效的方法,我会全神贯注。谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

您可以按顺序使用表达式。

SELECT car_id
FROM cars
WHERE Make_ID = 1
ORDER BY Year = 2006, Car_Type_ID = 7, Model_ID = 5

答案 1 :(得分:1)

这是使用case声明的另一种选择:

SELECT Car_ID, 
    CASE WHEN Model_Id = 5 AND Car_Type_Id = 7 AND Year = 2006 THEN 1 
         WHEN Model_Id = 5 AND Car_Type_Id = 7 THEN 2 
         WHEN Model_Id = 5 THEN 3 
         ELSE 4 
    END as ResultOrder
FROM Cars 
WHERE Make_ID = 1 
ORDER BY ResultOrder