我确信当我看到答案时,这会让我自己打耳光但是这里......
说我需要一个来自某个供应商的所有产品的清单,但他们需要通过顶部及以下的特定变量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查询中获得
答案 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