使用T-SQL

时间:2016-05-16 07:51:46

标签: sql sql-server tsql

我有一个数据库表(下面的架构):

Items
------
ItemId
UserId
FullURL

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

  1. 在完整网址字段中具有给定的部分网址或给定的域名,但优先考虑部分网址。

  2. 同样,为给定的UserId确定优先级,否则为任何用户返回。

  3. 我提出了这个基本查询(尝试在单个查询中执行),但它并没有按照我的要求对行进行优先排序:

    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(即任何用户)。

    希望它有意义。

    我很感激您的建议。

2 个答案:

答案 0 :(得分:2)

按表达式排序,提供您需要的优先级

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

答案 1 :(得分:-1)

SELECT TOP 1 * FROM(SELECT * FROM Items WHERE UserId >= 1)
WHERE
(FullURL LIKE '%website.com/product-132873%' OR FullURL LIKE '%website.com%')