In MySQL, il MAKE_SET()
la funzione restituisce un valore impostato (una stringa contenente sottostringhe separate da ,
caratteri) costituito dai caratteri specificati come argomenti quando si chiama la funzione.
Quando chiami la funzione, specifichi un numero qualsiasi di stringhe (separate da una virgola), nonché uno o più valori di bit che determinano quali stringhe restituire nel valore impostato.
Sintassi
La sintassi è questa:
MAKE_SET(bits,str1,str2,...)
Esempio
Ecco un esempio di base:
SELECT MAKE_SET(1, 'a','b','c','d') Result;
Risultato:
+--------+ | Result | +--------+ | a | +--------+
Questo risultato può sembrare ovvio all'inizio. Dopotutto, il nostro primo argomento è 1
e la funzione restituisce la prima stringa.
Tuttavia, non è proprio così che funziona.
Ecco un altro esempio.
SELECT MAKE_SET(4, 'a','b','c','d') Result;
Risultato:
+--------+ | Result | +--------+ | c | +--------+
Nota che ha restituito la terza stringa, anche se abbiamo specificato 4
come primo argomento?
Questo perché il MAKE_SET()
la funzione utilizza la rappresentazione binaria del primo argomento per restituire le stringhe applicabili negli argomenti successivi.
Guarda il seguente esempio di codice per capire cosa intendo:
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';
Risultato:
+------+------+------+------+------+------+------+------+------+------+ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | +------+------+------+------+------+------+------+------+------+------+ | 1 | 10 | 11 | 100 | 101 | 110 | 111 | 1000 | 1001 | 1010 | +------+------+------+------+------+------+------+------+------+------+
Qui uso il BIN()
funzione per restituire il valore binario di ogni numero.
Possiamo vedere che la rappresentazione binaria di 4
è 100
. Dobbiamo visualizzarlo al contrario per applicarlo al nostro MAKE_SET()
esempio sopra. Nel nostro caso, questo è un valore binario a tre cifre, con la cifra più a destra corrispondente alla prima stringa, la cifra successiva corrisponde alla seconda stringa e la cifra più a sinistra corrisponde alla terza stringa.
In termini binari, 1
è "on" e 0
è spento". Il MAKE_SET()
la funzione restituisce solo stringhe che hanno un 1
corrispondente nel loro valore binario. Pertanto, il nostro esempio sopra restituisce la terza stringa.
Ecco un altro esempio che utilizza un valore diverso:
SELECT MAKE_SET(10, 'a','b','c','d') Result;
Risultato:
+--------+ | Result | +--------+ | b,d | +--------+
In questo caso, il valore binario è 1010
. Ha quindi due 1
s, che corrispondono al secondo e al quarto argomento della stringa.
Ecco altri esempi per dimostrare ulteriormente il concetto:
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';
Risultato:
+---+---+-----+---+-----+-----+-------+---+-----+-----+ | 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 | +---+---+-----+---+-----+-----+-------+---+-----+-----+
Ed ecco un esempio che utilizza un diverso insieme di stringhe:
SELECT MAKE_SET(5, 'Cat','Dog','Horse','Duck') Result;
Risultato:
+-----------+ | Result | +-----------+ | Cat,Horse | +-----------+
Valori binari multipli
Puoi usare una pipe per passare più valori binari nel primo argomento:
SELECT MAKE_SET(1 | 4, 'a','b','c','d') Result;
Risultato:
+--------+ | Result | +--------+ | a,c | +--------+
Nota che otterrai lo stesso risultato se inverti i valori binari nel primo argomento:
SELECT MAKE_SET(4 | 1, 'a','b','c','d') Result;
Risultato:
+--------+ | Result | +--------+ | a,c | +--------+
Valori NULL
Eventuali stringhe con valori NULL non vengono aggiunte al risultato.
Esempio:
SELECT MAKE_SET(1 | 4, 'a','b',NULL,'d') Result;
Risultato:
+--------+ | Result | +--------+ | a | +--------+