2016-05-27 8 views
2

Ich habe mit einigen Bit-Spalten gearbeitet. Ich muss basierend auf einer dritten Spalte die eine oder die andere Spalte auswählen. Das ist nicht meine Frage. Hier ist ein vereinfachtes Beispiel, um zu zeigen, was mir begegnet ist.Warum gibt die Ausgabe von Bits innerhalb eines "if" oder "wann" immer 0 aus? MySql 5.7

Beachten Sie, dass ColType in der "realen Welt" Szenario normalerweise über Fremdschlüssel verbunden ist.

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); 

Dies erstellt alle möglichen Kombinationen der 3 Spalten. Das Folgende sind die Abfragen, die ich mit diesen Daten ausgeführt habe.

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; 

Die Ergebnisse sind:

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 

Meine Frage ist: warum bestimmte Versionen dieser Abfrage arbeiten und andere nicht? Ich würde erwarten, dass die Tempentabelle die gleichen Werte wie in der ersten Auswahl hat, aber das ist eindeutig nicht der Fall. Warum also gibt es all diese Datenfehlanpassungen?

Edit: Ich verwende MySQL Workbench 6.3.6 Gemeinschaft auf Windows 7.

Antwort

0

es auf sqlfiddle.com Prüfung http://sqlfiddle.com/#!9/6e8bda0/1 Typ BIT statt 0,1 vielleicht wahr/falsch zurück, wenn es versucht, eine Zahl wahr/falsch zu setzen.

+0

Sie testen auf Version 5.6. Die Frage bezieht sich auf Version 5.7. Der Unterschied in der Ausgabe ist sichtbar. Was genau macht die Ausgabe alle 0, und warum ist es nicht so, wenn Sie das gleiche 'select' verwenden, um eine Tabelle zu erstellen? Ich sehe nicht wirklich, wie dies die Frage beantwortet. – trincot

+0

Deine Geige zeigt, dass das nicht der Fall ist (zumindest für MySql 5.6). Wenn Sie das Bit in ein Signed umwandeln, sehen Sie, dass es richtig auf 1 oder 0 geht (wie ich in meiner Frage gezeigt habe). Ich fand es interessant, dass dieses Verhalten in 5,6 nicht das gleiche ist; Die in der if-Anweisung zurückgegebenen Bits sind korrekt. – Cameron

+0

Inkonsistenz kann hier angesehen werden http://sqlfiddle.com/#!9/e0e1a/7 –

0

Ist es mit der Tatsache zu tun haben, dass, wenn Sie SELECT Sie die Auswahl alle 4 Ausgänge mit ColType = 1 und wenn Sie die letzten 2 Spalten einfügen basieren auf ColType = 2 ...? Ihre Auswahl und Ihr Einsatz sind nicht identisch? (möglicherweise mehr Ausschneiden und Einfügen Fehler?) Auch gibt es keine Spalte für Type2 von Ihrem Describe-Anweisung ... Ich fange an zu denken, dass Sie die Ergebnisse aus verschiedenen Orten ausgeschnitten und eingefügt wurden und das Ergebnis könnte für eine andere eingefügt werden Erklärung.

+0

Mein schlechtes, ich hatte eine alte Abfrage kopiert, aber ich habe die richtige Ausgabe verwendet . Ich habe die Abfrage aktualisiert, um korrekt zu sein. Dies beantwortet meine Frage jedoch immer noch nicht. Ich würde mich freuen, wenn Sie eine Frage ein zweites Mal beantworten, um Ihre alte Antwort aufzugeben, statt die alte komplett zu bearbeiten. – Cameron

+0

Warum gibt Ihr DESCRIBE immer noch nicht die Spalte Type2 zurück? –