相关疑难解决方法(0)

现代DBMS是否包括短路布尔评估?

许多现代编程语言都有短路布尔评估,如下所示:

if (x() OR y())
Run Code Online (Sandbox Code Playgroud)

如果x()返回true,y()则永远不会评估.

现代DBMS(SQL Server,Sybase,Oracle,DB2等)上的SQL是否具有此属性?

特别是如果布尔语句的左侧是布尔常量,它是否会被短路?


相关:所有编程语言都有布尔短路评估吗?

sql database optimization

5
推荐指数
1
解决办法
635
查看次数

T-SQL选择与ISNUMERIC匹配的值,并且也在指定范围内.(加上Linq-to-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)

t-sql linq-to-sql predicatebuilder

4
推荐指数
1
解决办法
1万
查看次数

Delphi中的布尔表达式求值顺序?

if exp1 and exp2 and exp3 then
    //something
Run Code Online (Sandbox Code Playgroud)

Delphi中exp1、exp2和exp3(当然都是Boolean)的求值顺序是定义的还是随机的?

delphi pascal boolean logical-operators

4
推荐指数
1
解决办法
226
查看次数

SQL Server性能提示

可能重复:
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)

sql t-sql sql-server performance sql-server-2005

3
推荐指数
2
解决办法
307
查看次数

OR的表现?

可能重复:
SQL Server - 查询短路?
是否对SQL WHERE子句进行了短路评估?

我有一个关于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中依赖它.

t-sql sql-server-2005 database-performance

2
推荐指数
1
解决办法
236
查看次数

复合键字段的最佳顺序是什么?

假设我有一个包含以下字段的表:

  • LeagueID
  • MatchID
  • 一些数据

联盟将举办许多比赛.通常每个联盟都将使用自己的本地数据库,因此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

2
推荐指数
1
解决办法
192
查看次数

AND和OR优先

这不属于任何特定语言,而是逻辑.我只是以SQL为例:我有两个子句:

(1)A1和A2在哪里

(2)在哪里A1或A2

在(1)情况下,在检查A1为假之后会查询停止吗?在(2)的情况下,在检查A1为真之后会查询停止吗?

如果有人问过,请将此标记为重复.

谢谢

sql logic

1
推荐指数
1
解决办法
71
查看次数