在问另一个问题时,我发现SQL
Server(在2005年和2008年同时发生)在处理CASE
窗口函数子句中的语句时似乎有奇怪的不一致行为。以下代码给出了一个错误:
declare @t table (SortColumn int)
insert @t values (1), (2), (3)
declare @asc bit
set @asc = 0
select row_number() over (order by
case when 1=1 then SortColumn end asc,
case when 1=0 then SortColumn end desc) RowNumber
, *
from @t
错误是 窗口函数不支持将常量用作ORDER BY子句表达式。
我认为这是因为该case
语句的计算结果可能为NULL
,这是一个常量。也可能像预期的那样,此代码给出了相同的错误:
declare @t table (SortColumn int)
insert @t values (1), (2), (3)
declare @asc bit
set @asc = 0
select row_number() over (order by
NULL asc,
NULL desc) RowNumber
, *
from @t
…大概是出于同样的原因。但是,此代码不会给出错误:
declare @t table (SortColumn int)
insert @t values (1), (2), (3)
declare @asc bit
set @asc = 0
select row_number() over (order by
case when @asc=1 then SortColumn end asc,
case when @asc=0 then SortColumn end desc) RowNumber
, *
from @t
与第一个代码块的唯一区别是,我已将case
语句的条件操作数之一移至变量@asc
。现在可以正常工作了。为什么呢?该case
声明可能还是评估到NULL
,这是一个常数,因此它不应该工作…但它确实。这是某种程度的一致性,还是Microsoft提出的特殊情况行为?
可以通过使用此查询来检查所有这些行为。
更新: 此限制不仅适用于OVER
子句(尽管它们确实会给出不同的错误)-它适用于ORDER BY
SQL Server 2005之后的所有子句。
这是一个查询,其中也显示了带有常规SELECT
的ORDER BY
子句的限制。
联机丛书表明“排序列可以包含表达式,但是当数据库处于SQL Server(90)兼容模式时,表达式无法解析为常量。” 但是,它没有定义“常量”。
通过考虑和实验,可以清楚地看出这意味着可以在编译时成功计算出其常量值的表达式。
/*Works - Constant at run time but SQL Server doesn't do variable sniffing*/
DECLARE @Foo int
SELECT ROW_NUMBER() OVER (ORDER BY @Foo)
FROM master..spt_values
/*Works - Constant folding not done for divide by zero*/
SELECT ROW_NUMBER() OVER (ORDER BY $/0)
FROM master..spt_values
/*Fails - Windowed functions do not support
constants as ORDER BY clause expressions.*/
SELECT ROW_NUMBER() OVER (ORDER BY $/1)
FROM master..spt_values
这在我看来是一个罕见的问题,所以我不确定我会得到一个答案。我张贴的程序重现这个错误,希望你能帮助我。 您有没有尝试过在Jcef(Java-铬嵌入式框架)示例应用程序(简单或详细)中通过做获得的浏览器实例中执行打开新窗口并注意到奇怪的行为?每当在主窗口之外创建一个新窗口时,单击新窗口不会将其置于前面(或焦点)。主窗口(包含浏览器的UIComponent的JFrame)立即窃取焦点并将另一个窗口发回。
根据文献记载 must_not子句(query)不能出现在匹配的文档中。 我有如下查询: 在我的elasticsearch存储库中有两个URI 1) 编辑这里是我的映射
问题内容: 我遇到了来自java.util.Calendar的奇怪行为: 我想知道为什么会这样吗? 问题答案: 问题是您要从2013年1月30日开始使用日历。 然后,您将年份设置为2013年-这不是问题。 然后,您将月份设置为1(即2月)。您希望在这里发生什么?实际发生的情况是,它会记住需要将月份设置为1,而 不是 重新计算实际时间值。根据文档(Emphsis我的), 将 在您调用to时重新计算时
但是,我犯了一个错误,写了这样一段话: 然后我写道: 没有打印任何输出,所以我的问题是,基本上,为什么?
问题内容: 我正在尝试创建一个SQL查询,该查询将拉取自Windows函数内的最后一个最大值起的最后5行以来的行数。在下面的示例中,它将为第8行返回2。最大值为12,即从第8行起的2行。 对于第6行,它将返回5,因为7的最大值位于5行之外。 我尝试了以下方法: 这使我达到最大值,但是我无法有效地确定它有多少行。我能够使用SELECT中的多个变量来接近,但这似乎没有效率或可伸缩性。 问题答案: 您可
下面的代码是一个小示例,可以轻松重现问题。所以我有 String 类型的变量,它设置了默认值。我有3种方法: getter 塞特 将字符串转换为布尔值的方便方法 自省不会将getter作为readMethod返回,将setter作为WriteMethod返回。相反,它将isTest()方法作为readMethod返回。setter为空。 从文档中我了解到,如果类型是boolean,那么" is "