gpt4 book ai didi

mysql - 选择数据 `not exists` 并选择空列或 `is null` - MySQL

转载 作者:行者123 更新时间:2023-11-29 06:31:19 26 4
gpt4 key购买 nike

这是我当前的查询:

select * from outerb where not exists(
Select * from wms
where wms.barcode = outerb.barcode);

此查询返回我需要的值。

到目前为止一切顺利...

接下来我需要选择一个没有写入任何值的特定列(在本例中是pcode)。这是我尝试过并且对我来说效果非常好的方法:

select * from outerb where not exists(
Select * from wms
where wms.barcode = outerb.barcode)
and pcode = "" or pcode is null;

但是当我向查询添加另一列时,它会返回 pcode 的空列,但对于新列,它会返回空值和填充值。这是我很困惑的一点。这是我尝试过的:

select * from outerb where not exists(
Select * from wms
where wms.barcode = outerb.barcode)
and pcode = "" or pcode is null
and
brand = "" or brand is null;

Pcode 工作得很好,但 brand 却不行..有什么问题吗?

但是,如果我颠倒两者,那么 brand 在查询中排在第一位,pcode 排在第二位,这次显示的是 pcode有值(value)观和品牌没有值(value)观。

两列都是 Varchar 类型

最佳答案

放入括号

select * 
from outerb
where
not exists(
select *
from wms
where
wms.barcode = outerb.barcode
)
and (pcode = '' or pcode is null)
and (brand = '' or brand is null);

每当您混合 AND 和 OR 时,请使用括号让 DB 和在您之后维护它的人清楚哪一组事实是在一起的。如果没有它们,MySQL 将首先评估任何 AND,然后评估任何 OR。这意味着当您说:

a AND b OR c AND d OR e

MySQL 会做,而不是你想要的:

(a AND b) OR (c AND d) OR e --MySQL does
a AND (b OR c) AND (d OR e) --you wanted

这两个事实是非常不同的

看看Mysql or/and precedence?了解更多信息

Tim 的脚注和使用 MySQL 时的一般建议 - MySQL 可能有点像 Visual Basic 6 - 在其默认设置中,它允许您比大多数其他数据库更草率地编码。诸如不必在使用聚合的查询上提供显式 GROUP BY 之类的事情;它只会为你发明一个分组。当 SQL 标准是单引号时,它还允许对字符串使用双引号。 SQL 标准使用双引号来引用列名等,因此 SELECT a 作为“带有空格的我的列名”- MySQL 也允许字符串使用双引号,这不符合规范。那么为什么要坚持规范呢?它使您的数据库技能更加便携 - 如果您学习标准 sql,它比 MySQL 特定的 sql 可以在更多地方使用,这意味着您可以在工作面试中更有信心地说您的数据库交叉技能很好,因为您使用了一系列通过将学习重点放在 sql 标准上来了解数据库,而不是说“我只使用过 MySQL,但我确信我可以学习......”。当然,您总是会遇到供应商特定的内容,因为标准无法像实现那样满足消费者的需求。边注;我相信 Postgres 是严格遵守 SQL 规范的更好数据库之一,因此是一个很好的学习数据库

关于mysql - 选择数据 `not exists` 并选择空列或 `is null` - MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56075710/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com