为啥在“if”或“when”中输出位总是输出 0? mysql 5.7

Posted

技术标签:

【中文标题】为啥在“if”或“when”中输出位总是输出 0? mysql 5.7【英文标题】:Why does outputting bits inside of an "if" or "when" always output 0? MySql 5.7为什么在“if”或“when”中输出位总是输出 0? mysql 5.7 【发布时间】:2016-09-26 04:40:41 【问题描述】:

我一直在处理一些位列。我必须根据第三列选择一列或另一列。 这不是我的问题。 这是一个简化的示例来展示我遇到的情况。

CREATE TABLE Testing (
ColType TINYINT(6),
Type1 BIT(1) DEFAULT b'0',
Type2 BIT(1) DEFAULT b'0'
);

请注意,在“现实世界”场景中,ColType 通常通过外键加入。

INSERT INTO Testing
(ColType, Type1, Type2)
VALUES
(1, 0, 0),
(1, 0, 1),
(1, 1, 0),
(1, 1, 1),
(2, 0, 0),
(2, 0, 1),
(2, 1, 0),
(2, 1, 1);

这将创建 3 列的所有可能组合。以下是我使用这些数据运行的查询。

SELECT 
*,
IF(ColType = 1, Type1, Type2) Output1,
(CASE WHEN ColType = 1 THEN Type1 ELSE Type2 END) Output2,
IF(ColType = 1, CAST(Type1 AS SIGNED), CAST(Type2 AS SIGNED)) Output3,
IF(ColType = 1, Type1=1, Type2=1) Output4
FROM
Testing;

CREATE TEMPORARY TABLE Describer
SELECT
*,
IF(ColType = 1, Type1, Type2) Output1,
(CASE WHEN ColType = 1 THEN Type1 ELSE Type2 END) Output2,
IF(ColType = 1, CAST(Type1 AS SIGNED), CAST(Type2 AS SIGNED)) Output3,
IF(ColType = 1, Type1=1, Type2=1) Output4
FROM
Testing;

DESCRIBE Describer;
SELECT * FROM Describer;

结果是:

ColType  Type1  Type2  Output1  Output2  Output3  Output4
1        0      0      0        0        0        0
1        0      1      0        0        0        0
1        1      0      0        0        1        1
1        1      1      0        0        1        1
2        0      0      0        0        0        0
2        0      1      0        0        1        1
2        1      0      0        0        0        0
2        1      1      0        0        1        1
----------
Field    Type            Null  Key  Default Extra
ColType  tinyint(6)      YES
Type1    bit(1)          YES        b'0'
Output1  int(1) unsigned YES        b'1'
Output2  int(1) unsigned YES        NULL
Output3  int(1)          YES        NULL
Output4  int(1)          YES        NULL
----------
ColType  Type1  Type2  Output1  Output2  Output3  Output4
1        0      0      0        0        0        0
1        0      1      0        0        0        0
1        1      0      1        1        1        1
1        1      1      1        1        1        1
2        0      0      0        0        0        0
2        0      1      1        1        1        1
2        1      0      0        0        0        0
2        1      1      1        1        1        1

我的问题是:为什么此查询的某些版本有效而​​其他版本无效?我希望临时表的值与第一个选择中显示的值相同,但显然情况并非如此。那么为什么会出现所有这些不匹配的数据呢?

编辑: 我在 Windows 7 上使用 mysql Workbench 6.3.6 社区。​​p>

【问题讨论】:

【参考方案1】:

在 sqlfiddle.com 上测试它 http://sqlfiddle.com/#!9/6e8bda0/1 BIT 类型返回 true/false 而不是 0,1,可能当它尝试将 true/false 转换为数字时,它们最终都为零。

【讨论】:

您正在测试 5.6 版。问题是关于 5.7 版的。输出的差异是可见的。究竟是什么使输出全为 0,为什么在使用相同的 select 创建表时不是这样?我真的不明白这是如何回答这个问题的。 您的小提琴表明情况并非如此(至少对于 MySql 5.6)。将位转换为签名时,您会看到它正确地变为 1 或 0(正如我在问题中所展示的那样)。我发现有趣的是,这种行为在 5.6 中不一样; if 语句中返回的位是正确的。【参考方案2】:

这是否与当您选择时使用 ColType = 1 选择所有 4 个输出这一事实有关 当你插入最后两列时是基于ColType = 2...? 您的选择和插入不一样? (可能更多的剪切和粘贴错误?) 此外,您的“描述”语句中没有 Type2 列...我开始认为您已从不同位置剪切并粘贴了结果,而您粘贴的结果可能用于不同的语句。

【讨论】:

我错了,我复制了一个旧查询,但我使用了正确的输出。我已将查询更新为正确。然而,这仍然不能回答我的问题。如果您要再次回答问题以保留旧答案而不是完全编辑旧答案,我将不胜感激。 为什么您的 DESCRIBE 仍然没有返回 Type2 列?

以上是关于为啥在“if”或“when”中输出位总是输出 0? mysql 5.7的主要内容,如果未能解决你的问题,请参考以下文章

c语言输出的最后总是以“0”结尾是为啥?

为啥从 Presto 中的 dtap:// hive 表读取时总是得到 0 条记录作为输出?

为啥用excel的IF函数,不能输出空白呢

VHDL程序设计中,用WITH_SELECT_WHEN语句描述4个16位至1个16位输出的4选1多路选择器

excel表格内输入19位银行卡号,为啥后四位总是变成0?

请问php中$c=(-3)^3; echo $c;会输出多少?为啥?