我正在尝试使用列表中的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 BU
。ORDER 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,因此该代码尚未经过测试。