2009-11-09 19 views
7

Estoy desconcertado en cuanto a qué significa esta sentencia SQL:¿Qué significa un "conjunto + 0" en una declaración de SQL?

SELECT exhibitor_categories+0 from exhibitor_registry 

¿Cuál es exhibitor_categories + 0? Devuelve un número por cada fila devuelta.

exhibitor_categories se define como:

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

Gracias por su tiempo :)

+0

+1 Buena pregunta. Me pregunto si existe un equivalente para SQL Server 200/2005. –

Respuesta

7

Se convierte implícitamente el valor ajustado a un INTEGER.

Un conjunto es tratado como un mapa de bits, por lo que los primeros conjuntos de valores mordió 0, el segundo conjuntos de valores de bit 1 etc.

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

por ejemplo, ¿cómo se convierte un valor como "contemporáneo" en un número entero? o, como es un conjunto, ¿cómo se convierte "contemporáneo, al aire libre" en un número entero? ¿Tiene algún conocimiento sobre el propósito de convertir un valor establecido en un número entero? – Obay

+0

¡guau! ¡muy útil! ¿cómo se convirtió en 7 sin embargo? ¿no sería 6 porque 1 + 2 + 3 = 6? – Obay

+1

'@ Obay': un mapa de bits agrega potencias de dos para que no se mezclen. Es '2^0' + 2^1 +' 2^2 = 1 + 2 + 4 = 7'. Con '6', no sería capaz de distinguir entre, digamos,' 1 + 2 + 3' y '2 + 4'. – Quassnoi

4

Salida http://dev.mysql.com/doc/refman/5.0/en/set.html para la plena flaco, pero básicamente un campo como que es conocido como 'conjunto' - tiene una lista de valores posibles, que solo puede ser uno o más de esos. El valor se almacena como un número ... lo que significa que exhibitor_categories está almacenando realmente el valor 4 cuando alguien establece el valor en 'exterior', porque está configurando el tercer bit - '0100'. Cuando recuperas el valor de la base de datos más tarde, mysql automáticamente vuelve '0100' a 'exterior' para ti.

Pero, al agregar +0 a la consulta, fuerza el resultado para que permanezca un número, por lo que realmente obtendría el valor numérico '0100' si el valor de la fila fuera 'exterior' en este caso.

Disculpas por poner enum y establecer mixtos.

¿Por qué, podría preguntar, está estableciendo el valor en '0100' en lugar de simplemente decir '3', como en una enumeración? Debido a que un conjunto puede contener múltiples valores, si se seleccionaran los valores 'contemporáneo' (0001) y 'exterior' (0100), almacenaría '0101' < - configurando el primer y tercer bits, que serían devueltos como '5' si usas el código +0

+1

Este es un 'set' (bitmap), no un' enum'. Almacenar 'outdoor' establecerá el valor numérico en' 4'. – Quassnoi

+0

Quassnoi, ¿por qué 4? ¿No sería 3 ya que es el tercer elemento declarado? – Obay

Cuestiones relacionadas