2016-05-06 7 views
6

mam poniższej tabeli:Jak używać substr (...) dla kolumn typu danych BIT (...)?

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

Teraz próbuję dostać trzecią cyfrę (od lewej do prawej) z tych numeru. Przykład:

1001100111 
^// I want to get 0 

Więc to jest oczekiwany wynik:

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

Oto moje zapytanie:

SELECT SUBSTR(numb, 3, 1) FROM numbers 

Ale to nie działa. ponieważ bit(10) nie jest łańcuchem, a SUBSTR() nie może go przetworzyć. Czy istnieje jakieś obejście?

+0

Konwertuj najpierw na ciąg ... – HoneyBadger

+0

Czy zamiast tego można znaleźć cyfrę 8 zamiast prawej? – dasblinkenlight

+0

@ dasblinkenlight Tak .. – stack

Odpowiedz

2

Chociaż można użyć substr po konwersji do varchar, prostszym podejściu do BIT(...) typ danych to aby używać operatorów bitowych.

Ponieważ zgodnie z Twojego komentarza, że ​​jest OK, aby wyodrębnić 8-ty bit z prawej strony, a nie trzeci bit z lewej strony, to będzie produkować oczekiwany wynik:

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

Demo.

Czy mogę zaktualizować tylko jedną cyfrę? Chodzi mi o to, że chcę zaktualizować siódmą cyfrę (od prawej do lewej) z 1001011101 i zrobić to 0?

Można ustawić jeden bit na zero tak:

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

Pozycja 0 oznacza bit ustawiasz na zero.

Jeśli chcesz ustawić go 1 użyć

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

można mieć więcej niż jedno zero w pierwszym przykładzie, jeśli chcesz ustawić wiele bitów na zero.Podobnie, możesz mieć więcej niż jeden 1 w drugim przykładzie, jeśli chcesz ustawić wiele bitów na 1.

+0

Bardzo dobrze .. dziękuję .. upvote – stack

+0

Czy możesz mi powiedzieć, co to jest '& 1'? Właściwie ta część twojego zapytania jest dla mnie naprawdę trudna '(x >> 8) & 1' – stack

+0

@stack Edytowałem odpowiedź, powinna to być zmiana o 7, a nie o 8.' >> 7' oznacza "przejście do dokładnie o siedem ". Upuszcza prawe siedem bitów. '& 1' jest operacją maskowania. Oznacza "bitowy i 1" lub po prostu "weź najmniej znaczący bit". Ogólnie rzecz biorąc, wyrażenie oznacza "upuść ostatnie siedem bitów i zachowaj następny bit sam". – dasblinkenlight

3

Można konwertować BIT do VARCHAR (lub CHAR), a następnie użyć SUBSTR w następujących:

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

lub używając LEFT i RIGHT:

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

Jeśli masz kolumnę bitowej, następnie użyj operacji bitowych.

Są to udokumentowane here.

Jedną z metod jest:

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

Gdzie jest ** trzecia cyfra **? A ty brakuje "@ – stack

+0

@stack. . . "1" znajduje się na trzeciej cyfrze. –

+0

Rozumiem. dziękuję .. upvote – stack

Powiązane problemy