当前位置: 首页 > 面试题库 >

了解Sql Server查询-ORDER BY子句中的CASE

公冶泰
2023-03-14
问题内容

我正在尝试使用列表中的a来将CASE语句放入ORDER BY子句中,并发现一些我不理解的奇怪行为。这是一些代码:DISTINCT``SELECT

select distinct Requester, ISO_ID as ISO, (ISO_ID - 5 + 50) AS 'someNum', BU
from LoanerHeader order by
CASE WHEN 'a' = 'b' then Requester
when 'b' = 'c' then BU
else ISO_ID
end

这行得通。但是,如果我将第四行更改为when 'b' = 'b' then BU

select distinct Requester, ISO_ID as ISO, (ISO_ID - 5 + 50) AS 'someNum', BU
from LoanerHeader order by
CASE WHEN 'a' = 'b' then Requester
when 'b' = 'b' then BU
else ISO_ID
end

它因错误而中断:

如果指定了SELECT DISTINCT,则ORDER BY项目必须出现在选择列表中。

BU显然是在选择列表中。甚至更陌生的是当我将代码更改为:

select distinct Requester, ISO_ID as ISO, (ISO_ID - 5 + 50) AS 'someNum', BU
from LoanerHeader order by
CASE WHEN 'a' = 'b' then Requester
when 'b' = 'b' then BU
else BU   --change is here
end

它再次起作用!这甚至有道理吗?有人可以帮我绕过这个大脑吗?


问题答案:

规则CASE是将结果强制转换为具有最高优先级的分支的数据类型。

对于第一个查询,它使用矛盾检测,并且仅生成ISO_ID直接排序的计划。这已经是数字了,因此不需要隐式转换,因此可以毫无问题地匹配选择列表中的表达式。

对于第二个查询,它可以再次在编译时确定它需要进行的操作ORDER BY BUORDER BY CAST(BU AS NUMERIC)由于上述原因,除实际需要外。这意味着它将需要ORDER BY一个不与SELECT列表中任何内容匹配的计算表达式。因此出现了问题。

您的第三个查询从中删除了优先级更高的表达式,CASE从而消除了对隐式强制转换的需要(并因此消除了对计算表达式进行排序的需要)。

由于计算的表达式完全取决于SELECT DISTINCT列表中的列,但是您可以按如下方式重写第二个查询。

;WITH CTE AS
(
SELECT DISTINCT Requester,
                ISO_ID              AS ISO,
                ( ISO_ID - 5 + 50 ) AS 'someNum',
                BU
FROM   LoanerHeader
)
SELECT *
FROM CTE
ORDER  BY CASE
            WHEN 'a' = 'b' THEN Requester
            WHEN 'b' = 'b' THEN BU
            ELSE ISO
          END


 类似资料:
  • 问题内容: 我们正在开发一个使用EJB连接到数据库的Web应用程序。 在我们的数据库模型中,我们有一个移动设备表,另一个有功能表,最后一个有手机模型映射功能值的表。模型(id_model,…)功能(id_feature,…)model_features(id_model,id_feature,值) 我们想要执行一个查询,以按匹配特征的数量对模型进行排序。就是说,我们传递了一个要匹配的功能列表(即从

  • 问题内容: 我最近才刚开始使用SQLAlchemy,但仍无法解决某些概念。 归结为基本元素,我有两个这样的表(通过Flask-SQLAlchemy): 我将如何查询用户列表及其最新帖子(不包括无帖子的用户)。如果我使用的是SQL,则可以执行以下操作: 因此,我确切地知道“期望的” SQL可以达到我想要的效果,但是不知道如何在SQLAlchemy中“正确地”表达它。 编辑:如果很重要,我使用的是SQ

  • 问题内容: 将SELECT查询放在UPDATE查询的WHERE子句中时出现错误。 我的查询是这样的: AND错误将显示如下: “无法在FROM子句中指定目标表’m’进行更新” 问题答案: 实际上,您可以通过将其包装在子查询中来更新它(从而为结果创建临时表) 或使用 JOIN

  • 我有一个类Api,它包含一个数据列表:

  • 问题内容: 我们正在将JPA与hibernate用作提供程序,我们有一个查询,该查询包含一个与FROM子句中的子查询的联接,但是会出现以下错误: org.hibernate.hql.ast.QuerySyntaxException:意外令牌:(在第1行第75列附近[SELECT sd from com.hp.amber.datamodel.entities.analysis.SnapshotDat

  • 问题内容: 谁能给我一些关于如何将这种子查询放入提示?(我正在使用 JPA 2.0 - Hibernate 4.x ) -第二个选择将始终获得单个结果或null。 问题答案: 尝试类似以下示例的操作来创建子查询: 请注意,由于附近缺少IDE,因此该代码尚未经过测试。