I MySQL, MAKE_SET()
funktion returnerar ett uppsättningsvärde (en sträng som innehåller delsträngar separerade med ,
tecken) som består av de tecken som anges som argument när du anropar funktionen.
När du anropar funktionen anger du valfritt antal strängar (avgränsade med komma), samt ett eller flera bitvärden som avgör vilka strängar som ska returneras i det inställda värdet.
Syntax
Syntaxen ser ut så här:
MAKE_SET(bits,str1,str2,...)
Exempel
Här är ett grundläggande exempel:
SELECT MAKE_SET(1, 'a','b','c','d') Result;
Resultat:
+--------+ | Result | +--------+ | a | +--------+
Detta resultat kan tyckas uppenbart till en början. Vårt första argument är trots allt 1
, och funktionen returnerar den första strängen.
Det är dock inte riktigt så det fungerar.
Här är ett annat exempel.
SELECT MAKE_SET(4, 'a','b','c','d') Result;
Resultat:
+--------+ | Result | +--------+ | c | +--------+
Lägg märke till att den returnerade den tredje strängen, även om vi angav 4
som första argument?
Detta beror på att MAKE_SET()
funktionen använder den binära representationen av det första argumentet för att returnera de tillämpliga strängarna i de efterföljande argumenten.
Titta på följande kodexempel för att se vad jag menar:
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';
Resultat:
+------+------+------+------+------+------+------+------+------+------+ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | +------+------+------+------+------+------+------+------+------+------+ | 1 | 10 | 11 | 100 | 101 | 110 | 111 | 1000 | 1001 | 1010 | +------+------+------+------+------+------+------+------+------+------+
Här använder jag BIN()
funktion för att returnera varje nummers binära värde.
Vi kan se att den binära representationen av 4
är 100
. Vi måste visualisera detta baklänges för att kunna tillämpa det på vår MAKE_SET()
exemplet ovan. I vårt fall är detta ett tresiffrigt binärt värde, där siffran längst till höger motsvarar den första strängen, nästa siffra motsvarar den andra strängen och siffran längst till vänster motsvarar den tredje strängen.
I binära termer, 1
är "på" och 0
är av". MAKE_SET()
funktion returnerar endast strängar som har en motsvarande 1
i deras binära värde. Därför returnerar vårt exempel ovan den tredje strängen.
Här är ett annat exempel med ett annat värde:
SELECT MAKE_SET(10, 'a','b','c','d') Result;
Resultat:
+--------+ | Result | +--------+ | b,d | +--------+
I det här fallet är det binära värdet 1010
. Den har därför två 1
s, som motsvarar de andra och fjärde strängargumenten.
Här är några fler exempel för att demonstrera konceptet ytterligare:
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';
Resultat:
+---+---+-----+---+-----+-----+-------+---+-----+-----+ | 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 | +---+---+-----+---+-----+-----+-------+---+-----+-----+
Och här är ett exempel med en annan uppsättning strängar:
SELECT MAKE_SET(5, 'Cat','Dog','Horse','Duck') Result;
Resultat:
+-----------+ | Result | +-----------+ | Cat,Horse | +-----------+
Flera binära värden
Du kan använda ett rör för att skicka flera binära värden i det första argumentet:
SELECT MAKE_SET(1 | 4, 'a','b','c','d') Result;
Resultat:
+--------+ | Result | +--------+ | a,c | +--------+
Observera att du får samma resultat om du vänder på de binära värdena i det första argumentet:
SELECT MAKE_SET(4 | 1, 'a','b','c','d') Result;
Resultat:
+--------+ | Result | +--------+ | a,c | +--------+
NULL-värden
Eventuella strängar med NULL-värden läggs inte till i resultatet.
Exempel:
SELECT MAKE_SET(1 | 4, 'a','b',NULL,'d') Result;
Resultat:
+--------+ | Result | +--------+ | a | +--------+