UNION ALL表,如果第一个SELECT中的@@ rowcount产生少于10行

时间:2013-08-14 23:13:42

标签: sql database

我正在尝试执行搜索机制使用的存储过程。

我希望它的工作方式是首先使用SELECT进行LIKE TOYOTA%。之后,如果结果产生的结果少于10个,我希望它附加或UNION ALL与另一个SELECT LIKE %TOYOTA%。{/ p>

所以基本上,这就是我要找的东西:

SELECT *
FROM CARS
WHERE CARS.MAKE LIKE '@searchQuery%'

IF(@@rowcount < 10)
   BEGIN
      UNION ALL
      SELECT *
      FROM CARS
      WHERE CARS.MAKE LIKE '%@searchQuery%'
   END

唯一的问题是我不能这样做 - 它不会让我在UNION ALL之前或之后使用IF

我这样做是因为我希望尽可能多地获得至少10个结果。如果我少了,那么我想用剩下的插槽填充可能在中间某处有TOYOTA名称的记录。

2 个答案:

答案 0 :(得分:1)

你可以这样做总是得到10个结果:

SELECT top 10 *
FROM CARS
WHERE CARS.MAKE LIKE '%@searchQuery%'
order by (case when cars.make like '@searchQuery%' then 0 else 1 end);

要严格按照自己的意愿行事(从搜索查询开始,然后在小于10的情况下填充到10),您可以使用窗口函数:

select c.*
from (SELECT c.*,
             row_number() over (order by (case when c.MAKE LIKE '@searchQuery%' then 0 else 1 end
                               ) as seqnum
      FROM CARS c
      WHERE c.MAKE LIKE '%@searchQuery%'
     ) c
 where c.MAKE LIKE '@searchQuery%' or seqnum <= 10;

答案 1 :(得分:0)

你应该使用我认为的表变量......

DECLARE @MyTableVar table(
    CarID int NOT NULL,
    Puertas int,
    Ruedas int,
    FechaDeSalida datetime);

您应该声明它与CARS表完全相同。然后你做

SELECT @MyTableVar=*
FROM CARS
WHERE CARS.MAKE LIKE '@searchQuery%'

现在在变量中,您有查询结果。最后:

IF(@@rowcount < 10)
   BEGIN
      SELECT *
      FROM @MyTableVar
      UNION ALL
      SELECT *
      FROM CARS
      WHERE CARS.MAKE LIKE '%@searchQuery%'
   END

抱歉我的英语不好!希望这有帮助!