如何在列表顶部获取某些SQL查询结果

时间:2010-03-03 19:08:52

标签: sql linq

我确信当我看到答案时,这会让我自己打耳光但是这里......

说我需要一个来自某个供应商的所有产品的清单,但他们需要通过顶部及以下的特定变量productType进行订购并不重要,但所有产品都必须在列表中。

所以基本上

SELECT * FROM Products p WHERE p.VendorID = 1 AND p.ProductType = 'widget'

作为要显示的第一行。然后,

SELECT * FROM Products p WHERE p.VendorID = 1 AND p.ProductType <> 'widget' 

下面。

我正在使用LINQ,如果这有帮助,但我甚至无法在常规SQL查询中获得

6 个答案:

答案 0 :(得分:4)

在Sql中:

SELECT *
FROM Products p
WHERE p.VendorID = 1
ORDER BY CASE WHEN p.ProductType = 'widget' THEN 1 ElSE 2 END

在Linq:

IQueryable<Product> query =
  from p in dc.Products
  where p.VendorID == 1
  orderby p.ProductType == "widget" ? 1 : 2
  select p;

答案 1 :(得分:3)

一个选项是:

SELECT *, 
        CASE p.ProductType WHEN 'widget' THEN 0 ELSE 1 END AS ProductPriority 
    FROM Products p 
    WHERE p.VendorID = 1 
    ORDER BY ProductPriority

答案 2 :(得分:2)

在选择部分中创建一个额外字段,指示它们是否应位于顶部。例如。

SELECT *, (p.ProductType = 'widget') AS thisfirst  FROM Products p WHERE p.VendorID = 1 ORDER BY thisfirst

答案 3 :(得分:1)

按照这样的案例陈述命令:

select * from products
order by case producttype when 'widget' then 1 end nulls last;

答案 4 :(得分:1)

我猜你正在使用LINQ to SQL,所以我认为最好使用LINQ查询:

db.Products
  .Where(p => p.VendorID == 1)
  .OrderBy(p => p.ProductType == 'widget')

答案 5 :(得分:1)

Brian的另一种方法是联合查询:

Select ...
From    (
        Select ..., 0 As SortOrder
        from Products
        Where VendorId = 1
            And ProductType = 'Widget'
        Union All 
        Select ..., 1
        from Products
        Where VendorId = 1
            And ProductType <> 'Widget'
        ) As Z
Order By Z.SortOrder