首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解像col01在哪里(真)这样的where-in子句?

如何理解像col01在哪里(真)这样的where-in子句?
EN

Stack Overflow用户
提问于 2019-10-31 10:55:10
回答 2查看 48关注 0票数 0

假设有一个名为tab01的表,并且它有一个名为col01varchar类型列。如下所示。

代码语言:javascript
复制
# the first statement
SELECT * FROM tab01 WHERE col01 IN (TRUE);
# the second statement
SELECT * FROM tab01 WHERE col01 IN (FALSE);
# the third statement
SELECT * FROM tab01 WHERE col01 IN ('val01');

MySQL 5.7参考手册中,这三个语句具有bit_expr [NOT] IN (expr [, expr] ...)的形式。根据我的直觉,只要expr被计算为True,行就应该返回。

为什么第一条语句什么也不返回?在我看来,第一个语句SELECT * FROM tab01 WHERE col01 IN (TRUE);应该返回所有记录,第二个语句SELECT * FROM tab01 WHERE col01 IN (FALSE);不应该返回任何记录。我在这个MySQL 5.7参考手册里找不到任何线索。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-31 11:06:38

对于MySql,TRUE等于1FALSE等于0

因此,第一项声明相当于:

代码语言:javascript
复制
SELECT * FROM tab01 WHERE col01 IN (1);

除非列col01包含等于1的值(或者以1开头,然后包含非数字字符),否则不会返回任何内容。

第二项声明相当于:

代码语言:javascript
复制
SELECT * FROM tab01 WHERE col01 IN (0);

如果列col01不包含与0相等的值,那么它也不会返回任何内容,在本例中,正如文档化的表达式计算中的类型转换中所解释的那样,还有其他因素需要考虑。

假设该列的col01数据类型为varchar,则比较:

代码语言:javascript
复制
col01 IN (0)

将执行col01INTEGER的隐式转换,除非col01的值以数字字符开头,否则此转换的结果将始终是0,因此比较的结果将是TRUE

因此,您的第二条语句将正常返回所有行。

票数 1
EN

Stack Overflow用户

发布于 2019-10-31 10:59:06

在MySQL中,TRUE计算为1。因此,第一个查询相当于:

代码语言:javascript
复制
SELECT * FROM tab01 WHERE col01 = 1;

第二项声明意味着:

代码语言:javascript
复制
SELECT * FROM tab01 WHERE col01 = 0;

如果col01不是数字,MySQL将在比较之前进行转换。如果比较的数值是0 (通常是:'a' = 0为真),这可能会导致令人惊讶的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58641831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档