为什么使用 LIKE 与 = 时会有不同的结果?
Why is there a different outcome when using LIKE vs. =?
我正在使用 Report Builder 3.0。我有一份报告,其中一种排序基于使用行组的 line
(它也在 line
上分组)。当我在查询代码 中使用 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
为什么使用不同的运算符会导致排序不同?如何让我的 report 对 A-Z 进行排序并仍然使用 =
运算符?在旁注中,我们的一位 I.T 告诉我。伙计们使用 =
因为使用 LIKE
会显着减慢查询速度,但看到它是如何导致这个问题的,我想知道我应该真正使用什么。这是真的吗?
下面我在 table.
中给出了所有可能的数据
**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语句似乎没有效果,因为在Report Builder的Design View中有不同的基于Row Groups的分组和排序规则
ORDER BY job, datevalue, shift
当你使用 "LN bm%" 之类的东西时,这里的“%”意味着任何东西都可以跟在这之后。这意味着它对任何类型的词都是开放的,所以在这种情况下 = 是真正的使用方式。因为您已经提到它应该以 "LN bm" 开头,之后的任何关键字都是可能的:)
如果您没有为查询指定任何排序,记录将按照数据库找到它们的顺序出现。
更改运算符可能会导致不同的执行计划。这意味着数据将使用不同的方法来查找正确的数据,并且将根据这些方法处理数据的方式按顺序返回行。
例如,索引扫描会按照该索引的顺序生成行,但是 table 扫描会按照它们恰好存储在 table 中的顺序生成行。
即使对于同一个查询,执行计划也可能会发生变化。数据库收集有关它用来选择执行计划的数据的统计信息,因此它可能会选择不同的计划,因为它对数据有更好的了解。
如果不指定查询的排序,您永远无法确定顺序是什么,甚至无法确定它会保持不变。
我正在使用 Report Builder 3.0。我有一份报告,其中一种排序基于使用行组的 line
(它也在 line
上分组)。当我在查询代码 中使用 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
为什么使用不同的运算符会导致排序不同?如何让我的 report 对 A-Z 进行排序并仍然使用 =
运算符?在旁注中,我们的一位 I.T 告诉我。伙计们使用 =
因为使用 LIKE
会显着减慢查询速度,但看到它是如何导致这个问题的,我想知道我应该真正使用什么。这是真的吗?
下面我在 table.
中给出了所有可能的数据**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语句似乎没有效果,因为在Report Builder的Design View中有不同的基于Row Groups的分组和排序规则
ORDER BY job, datevalue, shift
当你使用 "LN bm%" 之类的东西时,这里的“%”意味着任何东西都可以跟在这之后。这意味着它对任何类型的词都是开放的,所以在这种情况下 = 是真正的使用方式。因为您已经提到它应该以 "LN bm" 开头,之后的任何关键字都是可能的:)
如果您没有为查询指定任何排序,记录将按照数据库找到它们的顺序出现。
更改运算符可能会导致不同的执行计划。这意味着数据将使用不同的方法来查找正确的数据,并且将根据这些方法处理数据的方式按顺序返回行。
例如,索引扫描会按照该索引的顺序生成行,但是 table 扫描会按照它们恰好存储在 table 中的顺序生成行。
即使对于同一个查询,执行计划也可能会发生变化。数据库收集有关它用来选择执行计划的数据的统计信息,因此它可能会选择不同的计划,因为它对数据有更好的了解。
如果不指定查询的排序,您永远无法确定顺序是什么,甚至无法确定它会保持不变。