V MySQL je to MAKE_SET()
funkce vrací nastavenou hodnotu (řetězec obsahující podřetězce oddělené ,
znaků) skládající se ze znaků zadaných jako argumenty při volání funkce.
Když funkci zavoláte, zadáte libovolný počet řetězců (oddělených čárkou) a také jednu nebo více bitových hodnot, které určují, které řetězce se mají vrátit v nastavené hodnotě.
Syntaxe
Syntaxe vypadá takto:
MAKE_SET(bits,str1,str2,...)
Příklad
Zde je základní příklad:
SELECT MAKE_SET(1, 'a','b','c','d') Result;
Výsledek:
+--------+ | Result | +--------+ | a | +--------+
Tento výsledek se může na první pohled zdát jasný. Koneckonců, náš první argument je 1
a funkce vrátí první řetězec.
Takto to však úplně nefunguje.
Zde je další příklad.
SELECT MAKE_SET(4, 'a','b','c','d') Result;
Výsledek:
+--------+ | Result | +--------+ | c | +--------+
Všimněte si, že vrátil třetí řetězec, i když jsme zadali 4
jako první argument?
Je to proto, že MAKE_SET()
funkce používá binární reprezentaci prvního argumentu pro vrácení použitelných řetězců v následujících argumentech.
Podívejte se na následující příklad kódu, abyste viděli, co tím myslím:
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';
Výsledek:
+------+------+------+------+------+------+------+------+------+------+ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | +------+------+------+------+------+------+------+------+------+------+ | 1 | 10 | 11 | 100 | 101 | 110 | 111 | 1000 | 1001 | 1010 | +------+------+------+------+------+------+------+------+------+------+
Zde používám BIN()
funkce, která vrátí binární hodnotu každého čísla.
Můžeme vidět, že binární reprezentace 4
je 100
. Abychom to mohli aplikovat na naši MAKE_SET()
, musíme si to vizualizovat zpětně příklad výše. V našem případě se jedná o třímístnou binární hodnotu, přičemž číslice nejvíce vpravo odpovídá prvnímu řetězci, další číslice odpovídá druhému řetězci a číslice nejvíce vlevo odpovídá třetímu řetězci.
V binárním vyjádření 1
je „on“ a 0
je „vypnuto“. MAKE_SET()
funkce vrací pouze řetězce, které mají odpovídající 1
v jejich binární hodnotě. Náš příklad výše proto vrací třetí řetězec.
Zde je další příklad s použitím jiné hodnoty:
SELECT MAKE_SET(10, 'a','b','c','d') Result;
Výsledek:
+--------+ | Result | +--------+ | b,d | +--------+
V tomto případě je binární hodnota 1010
. Má tedy dvě 1
s, které odpovídají druhému a čtvrtému argumentu řetězce.
Zde je několik dalších příkladů, které tento koncept dále demonstrují:
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';
Výsledek:
+---+---+-----+---+-----+-----+-------+---+-----+-----+ | 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 | +---+---+-----+---+-----+-----+-------+---+-----+-----+
A zde je příklad s použitím jiné sady řetězců:
SELECT MAKE_SET(5, 'Cat','Dog','Horse','Duck') Result;
Výsledek:
+-----------+ | Result | +-----------+ | Cat,Horse | +-----------+
Více binárních hodnot
K předání více binárních hodnot v prvním argumentu můžete použít rouru:
SELECT MAKE_SET(1 | 4, 'a','b','c','d') Result;
Výsledek:
+--------+ | Result | +--------+ | a,c | +--------+
Všimněte si, že stejného výsledku získáte, pokud přehodíte binární hodnoty v prvním argumentu:
SELECT MAKE_SET(4 | 1, 'a','b','c','d') Result;
Výsledek:
+--------+ | Result | +--------+ | a,c | +--------+
Hodnoty NULL
Žádné řetězce s hodnotami NULL nejsou k výsledku připojeny.
Příklad:
SELECT MAKE_SET(1 | 4, 'a','b',NULL,'d') Result;
Výsledek:
+--------+ | Result | +--------+ | a | +--------+