【问题标题】:Compare boolean WHERE predicates against Boolean Values比较布尔 WHERE 谓词与布尔值
【发布时间】:2016-03-24 15:52:25
【问题描述】:

我正在扩展一个内部 SQL 生成器。

这个生成器是用 C# 设计的,我正在添加从 Linq 查询构建 SQL 查询的功能。 Linq 查询可以具有“常量”表达式(即在 SQL 生成之前变为真/假/等的表达式)。

举个例子,像这样的 linq 查询:

var OuterProperty = *something*;
ParentObject.Where(
  element =>
    OuterProperty != null && element.Property == OuterProperty
)

可以归结为:

SELECT Property FROM ParentObject WHERE true AND Property = OuterProperty

这在 SQL 中失败,因为我在 where 谓词中使用了实际的布尔值。

我的问题是; 是否可以通过这种方式使用诸如布尔值之类的常量值?


要对此进行测试,您可以尝试以下 sn-p:

select 1 where IIF(true,1,0) = 1

这会给你以下错误:

在预期条件的上下文中指定的非布尔类型表达式,靠近 '('。

【问题讨论】:

  • 我希望您的代码会产生错误,例如“未知列true”。
  • 我用过类似1=1

标签: c# sql sql-server linq


【解决方案1】:

SQL 中不存在 TRUE 和 FALSE。

改为使用计算结果为真或假的表达式。

SELECT 'hello' WHERE (1 = 1);      // true:  selects 'hello'
SELECT 'world' WHERE (1 = 0);      // false: selects nothing

由于您自己生成 SQL,因此很容易优化大部分布尔值:

WHERE true  AND x   ==>    WHERE x
WHERE false AND x   ==>    remove the whole select
WHERE false         ==>    remove the whole select
WHERE true  OR  x   ==>    no where clause
WHERE true          ==>    no where clause
WHERE false OR  x   ==>    WHERE x

【讨论】:

  • 我现在就试试这个建议。
猜你喜欢
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多