使用T-SQL,按部分值的优先级选择行



我有一个数据库表(下面的模式):

Items
------
ItemId
UserId
FullURL

我想根据两个标准从中选择一行:

  1. 在完整URL字段中具有给定的部分URL或给定的域名,但对部分URL进行优先级排序。

  2. 类似地,为给定的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%')

最新更新