1

我正在尝试执行一个存储过程以供搜索机制使用。

我希望它工作的方式是首先SELECT使用LIKE TOYOTA%. 之后,如果结果产生的结果少于 10 个,我希望它附加或UNION ALL与另一个SELECT具有LIKE %TOYOTA%.

所以基本上,这就是我正在寻找的:

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

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

唯一的问题是我不能这样做 - 它不会让我UNION ALLIF.

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

4

2 回答 2

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;
于 2013-08-14T23:15:42.970 回答
0

You should use a table variable I think...

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

You should declare it exactly equal to the CARS table. Then you do

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

Now in the variable, you have your query result. Finally:

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

Sorry for my bad english! Hope this help!

于 2013-08-14T23:19:49.433 回答