我有一个数据库表(下面的模式):
Items
------
ItemId
UserId
FullURL
我想根据两个标准从中选择一行:
在完整URL字段中具有给定的部分URL或给定的域名,但对部分URL进行优先级排序。
类似地,为给定的UserId设置优先级,否则为任何用户返回。
我提出了这个基本查询(试图在一个查询中完成),但它并没有真正按照我的意愿对行进行优先级排序:
SELECT TOP 1 *
FROM Items
WHERE (FullURL LIKE '%website.com/product-132873%'
OR FullURL LIKE '%website.com%')
AND (UserId = 1 or UserId > 0)
理想的优化查询应该返回一行匹配(按优先顺序):
- FullURL LIKE'%website.com/product-132873%'(即部分URL)AND UserId=1(即给定用户),否则
- FullURL LIKE'%website.com/product-132873%'(即部分URL)AND UserId>0(即任何用户),否则
- FullURL LIKE"%website.com%"(即域)AND UserId=1(即给定用户),否则
- FullURL LIKE'%website.com%'(即域)AND UserId>0(即任何用户)
希望它有意义。
我将感谢你的建议。
通过表达式排序,该表达式为您提供所需的优先级
SELECT TOP 1 * FROM Items WHERE
(FullURL LIKE '%website.com/product-132873%' OR FullURL LIKE '%website.com%') AND
(UserId = 1 or UserId > 0)
ORDER BY
CASE WHEN FullURL LIKE '%website.com/product-132873% THEN 0 ELSE 2 END
+ CASE WHEN UserId=1 THEN 0 ELSE 1 END
SELECT TOP 1 * FROM(SELECT * FROM Items WHERE UserId >= 1)
WHERE
(FullURL LIKE '%website.com/product-132873%' OR FullURL LIKE '%website.com%')