【问题标题】:Booleans operators behavior布尔运算符行为
【发布时间】:2022-01-01 00:10:21
【问题描述】:

编辑:选择后我的查询中有错误。离开这里是因为答案很有趣。


我想为 MS SQL Server 创建一个过滤器,例如:

WHERE ((this IS NOT NULL) or (that IS NOT NULL))

我试过回复given at a similar question:

filter((TAB1.c.this.isnot(None)) | (TAB2.c.that.isnot(None)))

filter(or_(TAB1.c.PERSONNE_ID.isnot(None), (TAB2.c.PERSONNE_ID.isnot(None)))

但有了这些选项,我只能得到:

WHERE (this IS NOT NULL or that IS NOT NULL)

在 T-SQL 中,这是与我想要获得的过滤器不同的过滤器。

有什么提示吗?

【问题讨论】:

  • WHERE 语句有何不同?由于运算符优先级,第一个 sn-p 中的内部 () 不是根本不需要吗?
  • 不确定。确实这对我来说也很奇怪,但是如果我在 SQL 查询中测试它们,它们会给出不同的结果

标签: python tsql sqlalchemy


【解决方案1】:

两个WHERE 子句是相同的,因为IS NOT NULL 的运算符优先级高于OR,因此在OR 被评估之前首先被评估。

http://sqlfiddle.com/#!18/c0e9d/7

CREATE TABLE test (
  id INT,
  this INT,
  that INT
);
INSERT INTO test (id, this, that) VALUES (1, 2, NULL);
INSERT INTO test (id, this, that) VALUES (2, NULL, NULL);
INSERT INTO test (id, this, that) VALUES (3, NULL, 4);
INSERT INTO test (id, this, that) VALUES (4, 5, 6);

导致

SELECT * FROM test WHERE ((this IS NOT NULL) or (that IS NOT NULL));
SELECT * FROM test WHERE (this IS NOT NULL) or (that IS NOT NULL);
SELECT * FROM test WHERE (this IS NOT NULL or that IS NOT NULL);
SELECT * FROM test WHERE this IS NOT NULL or that IS NOT NULL;

全部返回第 1、3 和 4 行,仅省略两个值为 NULL 的项目 2。

【讨论】:

    猜你喜欢
    • 2010-11-20
    • 2023-03-12
    • 2011-04-20
    • 2011-09-27
    • 2011-03-27
    • 1970-01-01
    相关资源
    最近更新 更多