这是我的查询,
SELECT DISTINCT
BASE_Product.ProductId,
(CASE WHEN (BASE_Art.ArtId IS NOT NULL AND BASE_Heel.HeelId IS NULL)
THEN BASE_Art.ArtNo
ELSE (CASE WHEN (BASE_Art.ArtId IS NULL AND BASE_Heel.HeelId IS NOT NULL)
THEN BASE_Heel.HeelNo
ELSE (BASE_Art.ArtNo + '-' + BASE_Heel.HeelNo) END)END) AS ArtHeelNo,
BASE_InvoiceLine.Price
FROM
BASE_Product
INNER JOIN BASE_ProductVariation
ON BASE_Product.ProductId = BASE_ProductVariation.ProductId
INNER JOIN BASE_InvoiceLine
ON BASE_ProductVariation.ProductVariationId = BASE_InvoiceLine.ProductVariationId
LEFT OUTER JOIN BASE_Art
ON BASE_Product.ArtId = BASE_Art.ArtId
LEFT OUTER JOIN BASE_Heel
ON BASE_Product.HeelId = BASE_Heel.HeelId
WHERE
(BASE_InvoiceLine.InvoiceId = 2)
执行上述查询后,我将得到如下屏幕截图所示的结果。
以上结果由 ProductId 明智地排序,我想通过 HeelNo 明智地获得此订单。
问题是我不能明智地按 HeelNo 排序,因为在不同的选择和大小写上按子句排序..
我想要的结果应该是,
我怎样才能做到这一点..
由于 ORDER BY 在 SELECT 之后执行,因此您可以使用您在 SELECT 子句中定义的别名。
ORDER BY ArtHeelNo
另一个(不太推荐的)选项是仅按列数排序
也可以只重复 ORDER BY 中的语句,这是不太推荐的,因为如果你的语句会改变,你必须改变它两次。阅读起来也很麻烦。
正如 Yannick 建议的那样,您可以使用序数顺序,或者您可以将查询用作子查询并使用列名,但您也可以使用 CASE 语句的别名。
给定下一个示例:
使用别名:
作为子查询:
使用序数:
两种方法都返回相同的结果:
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=fef1ee61098f226cceb37ac2a3369b1f
正如您在小提琴中看到的那样,两种方法都显示了相同的执行计划。