2009-11-09 14 views
7

Jestem zaskoczony, co oznacza to stwierdzenie SQL:Co robi "zestaw + 0" w instrukcji SQL?

SELECT exhibitor_categories+0 from exhibitor_registry 

Co jest exhibitor_categories + 0? Zwraca liczbę dla każdego zwróconego wiersza.

exhibitor_categories jest zdefiniowany jako:

set('contemporary', 'classical impression/transitional', 'outdoor', 'home accessories') 

Dzięki za poświęcony czas :)

+0

+1 Ładne pytanie. Zastanawiam się, czy istnieje odpowiednik dla SQL Server 200/2005? –

Odpowiedz

7

To implicity konwertuje wartość ustawiona na INTEGER.

Zestaw jest traktowany jako bitmapy, więc ustawia wartość bitu 0 pierwsze, drugie ustawia wartość bitu 1 itp

mysql> CREATE TABLE exhibitor_registry(exhibitor_categories set('contemporary', 
'classical impression/transitional', 'outdoor', 'home accessories') NOT NULL); 

Query OK, 0 rows affected (0.08 sec) 

mysql> INSERT 
    -> INTO exhibitor_registry 
    -> VALUES ('contemporary,classical impression/transitional,outdoor'); 
Query OK, 1 row affected (0.03 sec) 

mysql> SELECT exhibitor_categories 
    -> FROM exhibitor_registry; 
+----------------------------------------------------------+ 
| exhibitor_categories          | 
+----------------------------------------------------------+ 
| contemporary,classical impression/transitional,outdoor | 
+----------------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT exhibitor_categories + 0 
    -> FROM exhibitor_registry; 
+--------------------------+ 
| exhibitor_categories + 0 | 
+--------------------------+ 
|      7 | 
+--------------------------+ 
1 row in set (0.00 sec) 
+0

na przykład, w jaki sposób wartość taka jak "contemporary" jest konwertowana na liczbę całkowitą? lub, skoro jest to zestaw, w jaki sposób "współczesny, zewnętrzny" jest konwertowany na liczbę całkowitą? Czy masz jakieś spostrzeżenia na temat zamiany wartości zadanej na liczbę całkowitą? – Obay

+0

wow! bardzo pomocne! Jak to się stało, że 7? czy nie byłoby 6, ponieważ 1 + 2 + 3 = 6? – Obay

+1

'@ Obay': bitmapa dodaje mocy dwóm, więc nie mieszają się. To '2^0' + 2^1 +' 2^2 = 1 + 2 + 4 = 7'. Przy "6" nie byłbyś w stanie odróżnić, powiedzmy, '1 + 2 + 3' i' 2 + 4'. – Quassnoi

4

Wyjazd http://dev.mysql.com/doc/refman/5.0/en/set.html dla pełnego chudy, ale w zasadzie jak to jest pole znany jako "zestaw" - ma listę możliwych wartości, które mogą być tylko jedną lub więcej z nich. Wartość jest zapisywana jako liczba ... co oznacza, że ​​wystawca_kategorie faktycznie przechowuje wartość 4, gdy ktoś ustawia wartość "na zewnątrz", ponieważ ustawia trzeci bit - "0100". Kiedy później odzyskasz wartość z bazy danych, mysql automatycznie zmieni "0100" z powrotem na "outdoor".

Ale, dodając +0 do zapytania, wymuszasz wynik na pozostaniu liczbą, więc faktycznie otrzymasz wartość liczbową "0100", jeśli w tym przypadku wartość wiersza została ustawiona na "outdoor".

Przeprosiny za uzyskanie wyliczenia i zmieszania.

Dlaczego, możesz zapytać, czy to jest ustawienie wartości "0100" zamiast po prostu "3", jak w wyliczeniu? Ponieważ zestaw może zawierać wiele wartości - jeśli wybrano wartości "współczesny" (0001) i "zewnętrzny" (0100), zapisałby on "0101" < - ustawiając pierwszy i trzeci bit, który zostałby zwrócony jako "5" jeśli używasz kodu +0.

+1

To jest "zestaw" (mapa bitowa), a nie "wyliczenie". Przechowywanie 'outdoor' ustawia wartość liczbową na" 4 ". – Quassnoi

+0

Quassnoi, dlaczego 4? Czy nie byłoby 3, ponieważ jest to trzeci element zadeklarowany? – Obay