SQL 服务器:一个查询 return 的结果可以一步到多部分搜索吗?

SQL Server: Can a query return results to multi-part searches in one step?

假设我们有一个汽车经销商网站,可以搜索品牌、型号、类型和年份。完整的搜索词是 Toyota Corolla Sedan 2006。 "Toyota" 在 Cars table 中由一个简单的数字 ID 键表示,"Corolla" 和 "Sedan" 也是如此。 Make、Model 和 Sedan 的键参考 MakesModelsCar_Types tables.

查询应该首先 return 完全匹配,即。所有 2006 年的 Toyota Corollas 汽车。那么相同的查询应该 return 2006 年以外年份的 Corollas,按相关性递减顺序排列,因此接近 2006 年的年份将排在第一位,然后是更远的年份,然后是return 其他不是花冠但仍然是轿车的丰田,最后是其他既不是花冠也不是轿车的丰田。

根据搜索参数使用 UNION 编写多阶段动态 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

感觉笨重。这是不雅的。如果您能提出更合理、更高效的方法,我会洗耳恭听。感谢您的宝贵时间!

您可以在 order by 中使用表达式。

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

这是另一个使用 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