2

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

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 Community。

4

2 回答 2

0

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

于 2016-05-27T22:13:42.883 回答
0

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

于 2016-05-27T19:12:38.593 回答