En MySQL, el MAKE_SET()
La función devuelve un valor establecido (una cadena que contiene subcadenas separadas por ,
caracteres) que consta de los caracteres especificados como argumentos cuando llama a la función.
Cuando llama a la función, especifica cualquier número de cadenas (separadas por una coma), así como uno o más valores de bits que determinan qué cadenas devolver en el valor establecido.
Sintaxis
La sintaxis es así:
MAKE_SET(bits,str1,str2,...)
Ejemplo
He aquí un ejemplo básico:
SELECT MAKE_SET(1, 'a','b','c','d') Result;
Resultado:
+--------+ | Result | +--------+ | a | +--------+
Este resultado puede parecer obvio al principio. Después de todo, nuestro primer argumento es 1
y la función devuelve la primera cadena.
Sin embargo, no es así como funciona.
Aquí hay otro ejemplo.
SELECT MAKE_SET(4, 'a','b','c','d') Result;
Resultado:
+--------+ | Result | +--------+ | c | +--------+
Observe que devolvió la tercera cadena, aunque especificamos 4
como primer argumento?
Esto se debe a que MAKE_SET()
la función usa la representación binaria del primer argumento para devolver las cadenas aplicables en los argumentos posteriores.
Mire el siguiente ejemplo de código para ver a qué me refiero:
SELECT BIN(1) AS '1', BIN(2) AS '2', BIN(3) AS '3', BIN(4) AS '4', BIN(5) AS '5', BIN(6) AS '6', BIN(7) AS '7', BIN(8) AS '8', BIN(9) AS '9', BIN(10) AS '10';
Resultado:
+------+------+------+------+------+------+------+------+------+------+ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | +------+------+------+------+------+------+------+------+------+------+ | 1 | 10 | 11 | 100 | 101 | 110 | 111 | 1000 | 1001 | 1010 | +------+------+------+------+------+------+------+------+------+------+
Aquí, uso el BIN()
para devolver el valor binario de cada número.
Podemos ver que la representación binaria de 4
es 100
. Necesitamos visualizar esto al revés para aplicarlo a nuestro MAKE_SET()
ejemplo anterior. En nuestro caso, este es un valor binario de tres dígitos, con el dígito más a la derecha correspondiente a la primera cadena, el siguiente dígito corresponde a la segunda cadena y el dígito más a la izquierda corresponde a la tercera cadena.
En términos binarios, 1
está "activado" y 0
esta apagado". El MAKE_SET()
la función solo devuelve cadenas que tienen un 1
correspondiente en su valor binario. Por lo tanto, nuestro ejemplo anterior devuelve la tercera cadena.
Aquí hay otro ejemplo usando un valor diferente:
SELECT MAKE_SET(10, 'a','b','c','d') Result;
Resultado:
+--------+ | Result | +--------+ | b,d | +--------+
En este caso, el valor binario es 1010
. Por lo tanto, tiene dos 1
s, que corresponden a los argumentos de la segunda y cuarta cadena.
Aquí hay algunos ejemplos más para demostrar aún más el concepto:
SELECT MAKE_SET(1, 'a','b','c','d') AS '1', MAKE_SET(2, 'a','b','c','d') AS '2', MAKE_SET(3, 'a','b','c','d') AS '3', MAKE_SET(4, 'a','b','c','d') AS '4', MAKE_SET(5, 'a','b','c','d') AS '5', MAKE_SET(6, 'a','b','c','d') AS '6', MAKE_SET(7, 'a','b','c','d') AS '7', MAKE_SET(8, 'a','b','c','d') AS '8', MAKE_SET(9, 'a','b','c','d') AS '9', MAKE_SET(10, 'a','b','c','d') AS '10';
Resultado:
+---+---+-----+---+-----+-----+-------+---+-----+-----+ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | +---+---+-----+---+-----+-----+-------+---+-----+-----+ | a | b | a,b | c | a,c | b,c | a,b,c | d | a,d | b,d | +---+---+-----+---+-----+-----+-------+---+-----+-----+
Y aquí hay un ejemplo usando un conjunto diferente de cadenas:
SELECT MAKE_SET(5, 'Cat','Dog','Horse','Duck') Result;
Resultado:
+-----------+ | Result | +-----------+ | Cat,Horse | +-----------+
Valores binarios múltiples
Puede usar una canalización para pasar múltiples valores binarios en el primer argumento:
SELECT MAKE_SET(1 | 4, 'a','b','c','d') Result;
Resultado:
+--------+ | Result | +--------+ | a,c | +--------+
Tenga en cuenta que obtendrá el mismo resultado si invierte los valores binarios en el primer argumento:
SELECT MAKE_SET(4 | 1, 'a','b','c','d') Result;
Resultado:
+--------+ | Result | +--------+ | a,c | +--------+
Valores NULOS
Las cadenas con valores NULL no se agregan al resultado.
Ejemplo:
SELECT MAKE_SET(1 | 4, 'a','b',NULL,'d') Result;
Resultado:
+--------+ | Result | +--------+ | a | +--------+