问题标签 [case-statement]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
9915 浏览

delphi - 为什么 CharInSet 比 Case 语句快?

我很困惑。今天在 CodeRage,Marco Cantu 说 CharInSet 很慢,我应该尝试使用 Case 语句。我在我的解析器中这样做了,然后用 AQTime 检查了加速是什么。我发现 Case 语句要慢得多。

4,894,539 次处决:

而不是 CharInSet (P^, [' ', #10,#13, #0]) 做 inc(P);

时间为 0.25 秒。

但相同数量的执行:

而 True do
  case P^ of
    ' ', #10, #13, #0: break;
    其他公司(P);
  结尾;

“while True”需要 0.16 秒,第一种情况需要 0.80 秒,else 情况需要 0.13 秒,总共需要 1.09 秒,或超过 4 倍。

CharInSet 语句的汇编代码是:

add edi,$02
mov edx,$0064b290
movzx eax,[edi]
call CharInSet
test a1,a1
jz $00649f18(回到add语句)

而案例逻辑就是这样:

movzx eax,[edi]
sub ax,$01
jb $00649ef0
sub ax,$09
jz $00649ef0
sub ax,$03
jz $00649ef0
add edi,$02
jmp $00649ed6(回到 movzx 语句)

在我看来,案例逻辑使用了非常高效的汇编程序,而 CharInSet 语句实际上必须调用 CharInSet 函数,该函数位于 SysUtils 中,也很简单,即:

函数 CharInSet(C: AnsiChar; const CharSet: TSysCharSet): 布尔值;
开始
Result := C in CharSet;
结尾;

我认为这样做的唯一原因是因为 [' ', #10, #13, #0] 中的 P^ 在 Delphi 2009 中不再允许,因此调用会转换类型以允许它。

尽管如此,我对此感到非常惊讶,但仍然不相信我的结果。

AQTime 测量是否有问题,我是否在比较中遗漏了什么,或者 CharInSet 真的是一个值得使用的高效函数?


结论:

我想你明白了,巴里。感谢您抽出宝贵时间做详细的示例。我在我的机器上测试了你的代码,得到了 0.171、0.066 和 0.052 秒(我猜我的台式机比你的笔记本电脑快一点)。

在 AQTime 中测试该代码,它给出了:三个测试的 0.79、1.57 和 1.46 秒。在那里,您可以看到仪器的大量开销。但真正让我吃惊的是,这种开销将明显的“最佳”结果更改为实际上是最差的 CharInSet 函数。

所以 Marcu 是正确的,而 CharInSet 更慢。但是您无意中(或者可能是故意)通过提取 CharInSet 对 Set 方法中的 AnsiChar(P^) 所做的事情,给了我一个更好的方法。除了与 case 方法相比速度稍有优势之外,它还比使用 case 方法更少的代码和更易于理解。

您还让我意识到使用 AQTime(和其他检测分析器)进行错误优化的可能性。知道这一点将有助于我对 Delphi 的 Profiler 和内存分析工具做出决定,这也是对我的问题AQTime 如何做到这一点的另一个答案?. 当然,AQTime 在检测时不会更改代码,因此它必须使用其他魔法来完成。

所以答案是 AQTime 显示的结果会导致错误的结论。


跟进:我留下了这个问题,“指责”AQTime 结果可能具有误导性。但公平地说,我应该指导您阅读这个问题:Delphi 是否有快速 GetToken 例程?它开始认为 AQTime 给出了误导性的结果,并得出结论认为它没有。

0 投票
3 回答
5525 浏览

sql - SQL CASE 语句

在 SQL Server 2000 中是否可以执行以下操作?

谢谢。

0 投票
3 回答
514 浏览

c# - 在c#中运行时确定的切换值

我在 c# 中有一个 case 语句。我想在运行时从配置文件中选择案例的值。这可能吗?

0 投票
5 回答
18362 浏览

sql - 为什么必须对 CASE 语句中的列进行 GROUP BY?

我试图在 SQL Server 2008 中针对某些数据输入不一致的表运行查询,我必须处理这个问题。

表数据示例:

我必须处理数量为负但 MarkedUpTotal 输入为正的情况。

我想运行以下查询:

但是,当我运行此查询时出现以下错误:

列 Qty 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

MarkedUpTotal 列在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

我希望得到以下结果:

当 CASE 语句有条件地使用它们时,我必须 GROUP BY Qty 和 MarkedUpTotal 对我来说似乎很奇怪。如果我删除最后一个选择(CASE 语句),则查询执行良好,并且不需要 Qty 或 Price 在 GROUP BY 中。

为什么 SQL 需要这个?是否有一个查询可以完成上述操作?

目前我正在通过使用临时表来解决这个问题。如果需要,我会修改每个条目的 MarkedUpTotal,然后在临时表的主查询中执行简单的 SUM(MarkedUpTotal)。

0 投票
1 回答
746 浏览

sql-server - 带有 OR 的 where 子句中的 case 语句

提前道歉,因为我觉得我可能忘记/错过了一些明显的东西。开始; 我在 WHERE 子句中使用了 case 语句,以下工作正常:

我的“问题”是我想在我的 ELSE 块中添加一个额外的 OR 子句。就像这样:

自然,这会引发此错误:关键字“OR”附近的语法不正确。在 ELSE 语句中

因此我的问题......我可以用来完成这个的正确/替代逻辑是什么?
先感谢您

0 投票
3 回答
1210 浏览

ruby-on-rails - If else 或 case 语句有帮助!

我真的可以使用一些帮助来完成以下任务:我的控制器中有以下内容(我知道这不应该在这里,需要移动到模型中)

这是一个电子邮件消息系统,因此根据您的职位,您可以通过电子邮件发送给一组人。因此,如果您是营长等,您可以选择向下面定义的 5 个组之一发送消息。如果您是连长,您的团队会发生变化。在视图中有一个下拉菜单,您可以选择您的消息发送到的组。选择菜单的填充取决于登录用户的位置。

问题似乎是“elsif”部分没有正确填充消息。它显示正确的下拉列表,并且就像发送了电子邮件但未填充电子邮件一样。然而,第一个值(营指挥官)工作正常。

我在 if else 语句中写错了什么吗?看起来应该很简单。用户位置总是正确反映,所以不是这样。

所以这不起作用,它适用于一组职位或另一组职位,但不能同时适用于两者。这与视图中的选择菜单相关,并且取决于您对某些人群的查询更改的位置。

所以在视图中我有这个:

我仍在学习rails,我不确定案例陈述是否会更好,但我对它的去向以及案例陈述如何融入视图感到困惑。

任何指导都会很棒,我正在努力解决这个问题并弄清楚,但我真的很感激一些帮助。

0 投票
2 回答
669 浏览

sql - TSQL - 如何用一个 case 语句返回 2 个值?

有没有办法使用一个CASE语句并返回 2 个不同的值?

以下查询有 2 个CASE条件相同的语句。

无论如何,要指定该CASE语句一次吗?
这样就不需要CASE在条件发生变化时使两个语句保持同步?

0 投票
3 回答
2303 浏览

oracle - IF 中的多个 Select 语句

我可以使用一些帮助来编写报告的 prog./sql 构造..

Sql 应该首先检查提示,然后决定应该运行哪些“选择”语句

类似的东西(伪代码)

以上似乎不起作用。请帮忙!

0 投票
4 回答
16122 浏览

sql - Progress DB SQL 的 LIKE 运算符

我正在尝试在 Progress SQL 中执行类似的操作(这不是 POSTGRES!)

但是 Progress 不支持 LIKE 运算符。INSTR看起来它可能会完成这项工作,但它是一个 Progress 扩展,我正在使用的数据库不支持它。是否有另一种使用标准 ODBC 函数来实现这一点的方法?

谢谢

0 投票
3 回答
8096 浏览

sql-server - SQL Case 语句能否通过?

有没有办法让 SQL 中的 CASE 语句像 C# 中的 case 语句一样失败?我不想做的是下面的例子,但如果这是我唯一的选择,我想我会去的。

例子:

编辑:

我正在使用 SQL Server。