我想知道,是否有一个Python等效的case语句,如VB.net或C#上提供的示例?
有什么区别
case item.class
when MyClass
# do something here
when Array
# do something different here
when String
# do a third thing
end
Run Code Online (Sandbox Code Playgroud)
和
case item.class
when MyClass.class
# do something here
when Array.class
# do something different here
when String.class
# do a third thing
end
Run Code Online (Sandbox Code Playgroud)
出于某种原因,这些中的第一个有时会起作用而第二个起作用,而其他时候,第二个起作用,而第一个起作用.为什么?哪一个是"正确"的方式呢?
该man页面说该case语句使用"文件名扩展模式匹配".
我通常想要一些参数的短名称,所以我去:
case $1 in
req|reqs|requirements) TASK="Functional Requirements";;
met|meet|meetings) TASK="Meetings with the client";;
esac
logTimeSpentIn "$TASK"
Run Code Online (Sandbox Code Playgroud)
我尝试过类似req*或者me{e,}t我理解的模式可以正确扩展以匹配文件名扩展上下文中的值,但它不起作用.
在这里找到了几个类似的问题,但无法弄清楚如何应用于我的场景.
我的函数有一个名为@IncludeBelow的参数.值为0或1(BIT).
我有这个问题:
SELECT p.*
FROM Locations l
INNER JOIN Posts p
on l.LocationId = p.LocationId
WHERE l.Condition1 = @Value1
AND l.SomeOtherCondition = @SomeOtherValue
Run Code Online (Sandbox Code Playgroud)
如果@IncludeBelow为0,我需要查询为:
SELECT p.*
FROM Locations l
INNER JOIN Posts p
on l.LocationId = p.LocationId
WHERE l.Condition1 = @Value1
AND l.SomeOtherCondition = @SomeOtherValue
AND p.LocationType = @LocationType -- additional filter to only include level.
Run Code Online (Sandbox Code Playgroud)
如果@IncludeBelow为1,则需要排除最后一行.(即不要应用过滤器).
我猜它需要是一个CASE声明,但无法弄清楚语法.
这是我尝试过的:
SELECT p.*
FROM Locations l
INNER JOIN Posts p
on l.LocationId = p.LocationId
WHERE l.Condition1 = …Run Code Online (Sandbox Code Playgroud) 我很困惑.在CodeRage今天,Marco Cantu说CharInSet很慢,我应该尝试使用Case语句.我在我的解析器中这样做,然后用AQTime检查加速是什么.我发现Case语句要慢得多.
执行的4,894,539次:
而不是CharInSet(P ^,['',#10,#13,#0])做inc(P);
时间为0.25秒.
但执行次数相同:
而确实是 ',#10,#13,#0的
案例P ^
:break;
else inc(P);
结束;
"while True"需要0.16秒,第一种情况需要0.80秒,else情况需要0.13秒,总计1.09秒,或者超过4倍.
CharInSet语句的汇编代码是:
添加edi,$ 02
mov edx,$ 0064b290
movzx eax,[edi]
调用CharInSet
测试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中并且也很简单,是:
function CharInSet(C:AnsiChar; const CharSet:TSysCharSet):Boolean;
begin
结果:= CharSet中的C;
结束;
我认为这样做的唯一原因是因为在Delphi 2009中不再允许['',#10,#13,#0]中的P ^,因此调用会转换类型以允许它.
尽管如此,我对此感到非常惊讶,仍然不相信我的结果.
AQTime是否测量错误,我在这个比较中遗漏了什么,或者CharInSet真的是一个值得使用的有效函数吗?
结论:
我想你明白了,巴里.感谢您抽出宝贵时间做详细示例.我在我的机器上测试了你的代码,得到了.171,.066和.052秒(我猜我的桌面比你的笔记本快一点).
在AQTime中测试该代码,它给出:三次测试的0.79,1.57和1.46秒.在那里,您可以看到仪器的大量开销.但令我惊讶的是,这种开销将明显的"最佳"结果改为CharInSet函数,这实际上是最差的.
所以Marcu是正确的,CharInSet更慢.但是你无意中(或者可能是故意的)通过在Set方法中提取CharInSet用AnsiChar(P ^)做的事情给了我一个更好的方法.除了比case方法更小的速度优势,它也比使用案例更少的代码和更容易理解.
您还让我意识到使用AQTime(以及其他仪器分析器)进行错误优化的可能性.知道这一点将有助于我决定使用Delphi的Profiler和内存分析工具,这也是我的问题的另一个答案AQTime如何做到这一点? …
这是场景:
case code
when 'www', '', nil
false
when 'code1', 'code2'... 'code_n' # The array STORE_CODES contains all the codes
true
else
false
end
Run Code Online (Sandbox Code Playgroud)
我怎样才能STORE_CODES直接使用when而不是'code1', 'code2'... 'code_n'
似乎如果我将案例堆叠在一起它们不能像一个一样工作.既然VB.NET案例不需要使用Exit Select/ Return,那么每次在它下面检测到新的Case时它似乎会自动放入?
Dim Test as Integer = 12
Select Case Test
Case 11
Case 12
Case 13
MsgBox.Show("Could be 11 or 12 or 13?")
End Select
Run Code Online (Sandbox Code Playgroud)
它似乎只工作13件作品..
Gotta always remember this rule that you can't stack Cases like this from now on
移植应用程序时要记住它并不容易
什么更有效 - 使用sql中的case语句处理或使用代码中的if语句处理相同的数据.我问,因为我的同事有一个包含许多案例陈述的巨大查询.我建议她通过编写案例陈述来减轻数据库的压力.我发现它更有效......但为什么呢?
我正在使用派生列任务使用CASE WHEN语句更改列数据.但是,我需要能够说..
SQL代码将是:
CASE WHEN Column01 LIKE '%i%' THEN '0' ELSE '1' END
Run Code Online (Sandbox Code Playgroud)
在SSIS表达语言中将是:
[Column01] == "i" ? "0" : "1" (that's for equals i, not, LIKE %i%.
Run Code Online (Sandbox Code Playgroud)
是否可以使用LIKE运算符?
有没有办法在SQL中使CASE语句像C#中的case语句一样?我不想做的是下面的例子,但如果那是我唯一的选择,我想我会选择它.
例:
@NewValue =
CASE
WHEN @MyValue = '1' THEN CAST(@MyValue AS int)
WHEN @MyValue = '2' THEN CAST(@MyValue AS int)
ELSE NULL
END
Run Code Online (Sandbox Code Playgroud)
编辑:
我正在使用SQL Server.
case-statement ×10
sql ×3
ruby ×2
sql-server ×2
asp-classic ×1
bash ×1
dataflowtask ×1
delphi ×1
delphi-2009 ×1
duck-typing ×1
python ×1
sql-like ×1
ssis ×1
t-sql ×1
vb.net ×1
where-clause ×1