Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么使用LIKE vs.时会出现不同的结果?_Sql Server_Sorting_Operators_Sql Like_Reportbuilder3.0 - Fatal编程技术网

Sql server 为什么使用LIKE vs.时会出现不同的结果?

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人员告诉我使用=

我正在使用报表生成器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人员告诉我使用
=
,因为像
这样使用
会显著降低查询速度,但考虑到它是如何导致这个问题的,我想知道我应该真正使用什么。这是真的吗

下面我给出了表中所有可能的数据

**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,它将被订购。