我正在尝试执行搜索机制使用的存储过程。
我希望它的工作方式是首先使用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名称的记录。
答案 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
抱歉我的英语不好!希望这有帮助!