2016-05-06 8 views
6

Ich habe diese Tabelle:Wie verwenden Sie substr (...) für BIT (...) Datentypspalten?

// numbers 
+---------+------------+ 
| id | numb | 
+---------+------------+ 
| int(11) | bit(10) | 
+---------+------------+ 
| 1  | 1001100111 | 
| 2  | 0111000101 | 
| 3  | 0001101010 | 
| 4  | 1111111011 | 
+---------+------------+ 

Jetzt versuche ich, dritte Ziffer (von links nach rechts) von jener Zahl zu erhalten. Beispiel:

1001100111 
^// I want to get 0 

So ist zu erwarten, Ergebnis:

+--------------------+ 
| substr(numb, 3, 1) | 
+--------------------+ 
| 0     | 
| 1     | 
| 0     | 
| 1     | 
+--------------------+ 

Hier ist meine Frage:

SELECT SUBSTR(numb, 3, 1) FROM numbers 

Aber es funktioniert nicht. weil bit(10) ist keine Zeichenfolge und SUBSTR() kann es nicht analysieren. Gibt es eine Problemumgehung?

+0

Konvertieren Sie es in eine Zeichenfolge zuerst ... – HoneyBadger

+0

Wäre es in Ordnung, statt der achten Ziffer von rechts zu finden? – dasblinkenlight

+0

@dasblinkenlight Ja .. – stack

Antwort

2

Obwohl Sie substr nach der Konvertierung zu varchar, einen einfacheren Ansatz für BIT(...) Datentyp verwenden könnte es Bitoperatoren zu verwenden.

select id, (x>>7)&1 
from test 

Demo.

:

Da nach Ihrem Kommentar ist es OK 8-te Bit von rechts zu extrahieren, anstatt dem dritten Bit von links, wird dies das erwartete Ergebnis produzieren

Ist es möglich, nur eine seiner Ziffern zu aktualisieren? Ich meine, ich möchte die siebte Ziffer (von rechts nach links) von 1001011101 aktualisieren und es 0 machen?

Sie können ein einzelnes Bit gesetzt, wie dies auf Null:

UPDATE test SET x = x & b'1110111111' WHERE id=3 

Position von 0 zeigt die Bit Sie auf Null setzen.

Wenn Sie es 1 festlegen möchten, verwenden Sie

UPDATE test SET x = x | b'0001000000' WHERE id=3 

Sie können im ersten Beispiel mehr als eine Null haben, wenn Sie mehrere Bits auf Null setzen möchten.Entsprechend können Sie im zweiten Beispiel mehrere 1 haben, wenn Sie mehrere Bits auf 1 setzen müssen.

+0

Sehr gut .. danke .. upvote – stack

+0

Können Sie mir bitte sagen, was ist '& 1'? Eigentlich ist dieser Teil Ihrer Anfrage wirklich schwer für mich '(x >> 8) & 1' – stack

+0

@stack Ich habe die Antwort bearbeitet, es sollte eine Verschiebung um 7 sein, nicht um 8.' >> 7' bedeutet "shift to the gleich um sieben ". Es lässt die rechten sieben Bits fallen. '& 1' ist eine Maskierungsoperation. Es bedeutet "bitweise und mit 1" oder einfach "nimm das niedrigstwertige Bit". Insgesamt bedeutet der Ausdruck "die letzten sieben Bits löschen und das nächste Bit in Ruhe lassen". – dasblinkenlight

3

Sie könnten konvertieren BIT-VARCHAR (oder CHAR) und dann SUBSTR in folgenden verwenden:

SELECT SUBSTR(CONVERT(VARCHAR(10),numb), 3, 1) 
FROM numbers 

Oder mit LEFT und RIGHT:

SELECT LEFT(RIGHT(CONVERT(VARCHAR(10),numb),8),1) 
FROM numbers 
2

Wenn Sie ein bisschen Spalte haben, Verwenden Sie dann Bitoperationen.

Diese sind dokumentiert here.

Eine Methode ist:

select ((numb & b'0010000000') > 0) 
+0

Wo ist ** dritte Ziffer **? Und Sie vermissen ein ' – stack

+0

@stack. . . Die "1" steht in der dritten Ziffer. –

+0

Ich verstehe. danke .. upvote – stack