许多现代编程语言都有短路布尔评估,如下所示:
if (x() OR y())
Run Code Online (Sandbox Code Playgroud)
如果x()返回true,y()则永远不会评估.
现代DBMS(SQL Server,Sybase,Oracle,DB2等)上的SQL是否具有此属性?
特别是如果布尔语句的左侧是布尔常量,它是否会被短路?
我试图从一个表中选择行(其中一个(NVARCHAR)列在数值范围内).
SELECT ID, Value
FROM Data
WHERE ISNUMERIC(Value) = 1 AND CONVERT(FLOAT, Value) < 66.6
Run Code Online (Sandbox Code Playgroud)
不幸的是,作为SQL规范的一部分,AND子句不必短路(并且不在MSSQL Server EE 2008上).更多信息:SQL WHERE子句的短路评估是什么?
我的下一次尝试是尝试这个,看看我是否可以延迟评估CONVERT
SELECT ID, Value
FROM Data
WHERE (CASE WHEN ISNUMERIC(Value) = 1 THEN CONVERT(FLOAT, Value) < 66.6 ELSE 0 END)
Run Code Online (Sandbox Code Playgroud)
但我似乎无法使用CONVERT的结果<(或任何比较).它因错误而失败
Incorrect syntax near '<'.
Run Code Online (Sandbox Code Playgroud)
我可以逃脱
SELECT ID, CONVERT(FLOAT, Value) AS Value
FROM Data
WHERE ISNUMERIC(Value) = 1
Run Code Online (Sandbox Code Playgroud)
所以显而易见的解决方案是将整个select语句包装在另一个SELECT和WHERE中,并从内部select和filter中返回转换后的值,在那里选择外部select.不幸的是,这是我的Linq-to-sql问题的来源.我不仅过滤了一个范围,而且过滤了很多,或者只是记录的存在(有一些日期范围选择和比较我遗漏了. )
基本上我希望能够生成这样的东西:
SELECT ID, TypeID, Value
FROM Data
WHERE (TypeID = 4 AND ISNUMERIC(Value) AND CONVERT(Float, Value) < 66.6)
OR …Run Code Online (Sandbox Code Playgroud) if exp1 and exp2 and exp3 then
//something
Run Code Online (Sandbox Code Playgroud)
Delphi中exp1、exp2和exp3(当然都是Boolean)的求值顺序是定义的还是随机的?
可能重复:
SQL WHERE子句是否已短路评估?
关于此查询,我有以下问题:
select * from sometable
where 1=1 or (select count(*) from table2 > 0)
Run Code Online (Sandbox Code Playgroud)
如果第一个条件为true(1=1),SQL Server是否仍然执行内部选择?或者在第一个条件为真时停止(如C)
我有一个关于T-SQL(SQL Server 2005)中逻辑OR运算符性能的问题.
我搜索了一下,但我找不到任何关于这个问题的内容.
如果您有以下查询:
SELECT * FROM Table WHERE (randomboolean OR HeavyToEvaluateCondition)
Run Code Online (Sandbox Code Playgroud)
randomboolean在第一个条件成立的情况下,为了节省性能,程序解释器是否会尽可能地跳过评估重型条件?
由于OR语句中的一个值为true,因此我们不必评估第二个条件,因为我们已经知道满足第一个条件!
我知道它在C#中是这样的,但我想知道我是否也可以在T-SQL中依赖它.
假设我有一个包含以下字段的表:
联盟将举办许多比赛.通常每个联盟都将使用自己的本地数据库,因此LeagueID字段在此本地数据库的所有记录中都是相同的.联盟每年一次将其数据上传到国家当局,然后联盟ID将有必要对具有相同MatchID的比赛进行识别.
实现复合主键的最佳方法是什么(使用EF Fluent API)?
Entity<Match>.HasKey(match=>new {match.LeagueID,match.MatchID})
Run Code Online (Sandbox Code Playgroud)
要么
Entity<Match>.HasKey(match=>new {match.MatchID,match.LeagueID})
Run Code Online (Sandbox Code Playgroud)
对于人眼来说,联盟 - 比赛的顺序是合乎逻辑的,因为它将把特定联盟的比赛保持在一起.但我明白,在编写复合键时,出于性能原因首先使用最具辨别力的字段非常重要.
database-design entity-framework composite-key entity-framework-5
这不属于任何特定语言,而是逻辑.我只是以SQL为例:我有两个子句:
(1)A1和A2在哪里
(2)在哪里A1或A2
在(1)情况下,在检查A1为假之后会查询停止吗?在(2)的情况下,在检查A1为真之后会查询停止吗?
如果有人问过,请将此标记为重复.
谢谢
sql ×3
t-sql ×3
boolean ×1
database ×1
delphi ×1
linq-to-sql ×1
logic ×1
optimization ×1
pascal ×1
performance ×1
sql-server ×1