Sql server 为什么使用LIKE vs.时会出现不同的结果?
我正在使用报表生成器3.0。我有一个报告,其中一个排序基于使用行组的Sql server 为什么使用LIKE vs.时会出现不同的结果?,sql-server,sorting,operators,sql-like,reportbuilder3.0,Sql Server,Sorting,Operators,Sql Like,Reportbuilder3.0,我正在使用报表生成器3.0。我有一个报告,其中一个排序基于使用行组的行(它也在行)进行分组。当我在查询代码中使用LIKE时,报告上的排序工作正常:它是按A-Z排序的。当我在查询代码中使用=时,报告将其排序如下: LN BM4 LN BM2 LN BM1 LN BM6 LN BM5 LN WT2 LN WT4 LN WT3 LN WT5 LN BM3 LN WT5 为什么使用不同的运算符会导致排序差异?如何让我的报告对A-Z进行排序,并且仍然使用=运算符?另一方面,我们的一个it人员告诉我使用=
行
(它也在行
)进行分组。当我在查询代码中使用LIKE
时,报告上的排序工作正常:它是按A-Z排序的。当我在查询代码中使用=
时,报告将其排序如下:
LN BM4
LN BM2
LN BM1
LN BM6
LN BM5
LN WT2
LN WT4
LN WT3
LN WT5
LN BM3
LN WT5
为什么使用不同的运算符会导致排序差异?如何让我的报告对A-Z进行排序,并且仍然使用=
运算符?另一方面,我们的一个it人员告诉我使用=
,因为像这样使用会显著降低查询速度,但考虑到它是如何导致这个问题的,我想知道我应该真正使用什么。这是真的吗
下面我给出了表中所有可能的数据
**Raw data (unsorted)**
LN BM1
LN BM2
LN BM3
LN BM4
LN BM5
LN BM6
LN WT1
LN WT2
LN WT3
LN WT4
LN WT5
LN WT6
查询代码
(CASE
WHEN jobs.Uf_Production_Line LIKE 'LN BM%' THEN jobs.Uf_Production_Line
WHEN jobs.Uf_Production_Line LIKE 'LN WT%' THEN jobs.Uf_Production_Line
ELSE
(CASE
WHEN IsNumeric(RIGHT(jobs.Uf_Production_Line, 4)) = 1
THEN RIGHT(jobs.Uf_Production_Line, 4)
ELSE
(CASE
WHEN IsNumeric(RIGHT(jobs.Uf_Production_Line, 3)) = 1
THEN RIGHT(jobs.Uf_Production_Line, 3)
ELSE
'99999'
END)
END)
END
) AS line
查询底部的ORDER BY语句似乎没有效果,因为在报表生成器的“设计”视图中,根据行组有不同的分组和排序规则
ORDER BY job, datevalue, shift
当您使用类似于“LN bm%”的内容时,这里的“%”表示在此之后可以出现任何内容。这意味着它对任何类型的词都是开放的,所以在本例中,=是真正的使用方式。因为您已经提到,它应该以“LN bm”开头,后面的任何关键字都是可能的:)如果您没有为查询指定任何排序,记录将按照数据库查找它们的顺序出现
更改操作员可能会导致不同的执行计划。这意味着数据将使用不同的方法来查找正确的数据,并且将根据这些方法处理数据的方式按顺序返回行
例如,索引扫描将按照该索引的顺序生成行,而表扫描将按照行在表中的存储顺序生成行
即使对于同一查询,执行计划也可以更改。数据库收集有关用于选择执行计划的数据的统计信息,因此它可以选择不同的计划,因为它对数据有更好的了解
如果不指定查询的排序,您就永远无法确定顺序是什么,甚至无法确定它是否保持不变。结果的顺序不取决于,如或=
。始终需要使用orderby
子句对结果进行排序显示的查询代码只是一个表达式。在查询中它在哪里使用?不。导致这种奇怪排序的原因是您的查询并没有排序依据,然后在查询中添加一个
orderby
,以获得可预测的排序。没有别的办法。如果您没有按
排序的
,则许多因素都会影响SQL Server返回结果的方式。另请参见,和。正如本页已多次提到的,顺序会发生变化,因为在每种情况下,查询报表生成器最终提交给SQL Server的内容都不同,因此会生成不同的计划,这将导致不同的订单,因为报表生成器没有按提交订单。(或者,报表生成器可能会以一个顺序收集结果,但以不同的顺序显示结果。对于报表生成器人员或Microsoft支持人员来说,这是一个顺序,因为这不应该是工具的工作方式。)但是,当我使用=
时,排序会出现什么问题?这是真正的问题。请在您的查询中添加Order By,它将被订购。