W MySQL funkcja MAKE_SET()
funkcja zwraca ustawioną wartość (łańcuch zawierający podciągi oddzielone ,
znaków) składający się ze znaków określonych jako argumenty podczas wywoływania funkcji.
Kiedy wywołujesz funkcję, określasz dowolną liczbę ciągów (oddzielonych przecinkiem), a także jedną lub więcej wartości bitowych, które określają, które ciągi mają zostać zwrócone w ustawionej wartości.
Składnia
Składnia wygląda tak:
MAKE_SET(bits,str1,str2,...)
Przykład
Oto podstawowy przykład:
SELECT MAKE_SET(1, 'a','b','c','d') Result;
Wynik:
+--------+ | Result | +--------+ | a | +--------+
Na pierwszy rzut oka ten wynik może wydawać się oczywisty. W końcu naszym pierwszym argumentem jest 1
, a funkcja zwraca pierwszy ciąg.
Jednak nie do końca tak to działa.
Oto kolejny przykład.
SELECT MAKE_SET(4, 'a','b','c','d') Result;
Wynik:
+--------+ | Result | +--------+ | c | +--------+
Zauważ, że zwrócił trzeci ciąg, mimo że określiliśmy 4
jako pierwszy argument?
Dzieje się tak, ponieważ MAKE_SET()
funkcja używa reprezentacji binarnej pierwszego argumentu, aby zwrócić odpowiednie ciągi w kolejnych argumentach.
Spójrz na poniższy przykład kodu, aby zobaczyć, co mam na myśli:
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';
Wynik:
+------+------+------+------+------+------+------+------+------+------+ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | +------+------+------+------+------+------+------+------+------+------+ | 1 | 10 | 11 | 100 | 101 | 110 | 111 | 1000 | 1001 | 1010 | +------+------+------+------+------+------+------+------+------+------+
Tutaj używam BIN()
funkcja zwracająca wartość binarną każdej liczby.
Widzimy, że binarna reprezentacja 4
to 100
. Musimy to zwizualizować wstecz, aby zastosować to do naszego MAKE_SET()
przykład powyżej. W naszym przypadku jest to trzycyfrowa wartość binarna, przy czym skrajna prawa cyfra odpowiada pierwszemu ciągowi, następna cyfra odpowiada drugiemu ciągowi, a skrajna lewa cyfra odpowiada trzeciemu ciągowi.
W kategoriach binarnych 1
jest „włączony” i 0
jest wyłączony". MAKE_SET()
funkcja zwraca tylko ciągi, które mają odpowiadające 1
w ich wartości binarnej. Dlatego nasz przykład powyżej zwraca trzeci ciąg.
Oto kolejny przykład z użyciem innej wartości:
SELECT MAKE_SET(10, 'a','b','c','d') Result;
Wynik:
+--------+ | Result | +--------+ | b,d | +--------+
W tym przypadku wartość binarna to 1010
. Dlatego ma dwa 1
s, które odpowiadają drugiemu i czwartemu argumentowi ciągu.
Oto kilka przykładów, aby lepiej zademonstrować tę koncepcję:
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';
Wynik:
+---+---+-----+---+-----+-----+-------+---+-----+-----+ | 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 oto przykład z użyciem innego zestawu ciągów:
SELECT MAKE_SET(5, 'Cat','Dog','Horse','Duck') Result;
Wynik:
+-----------+ | Result | +-----------+ | Cat,Horse | +-----------+
Wiele wartości binarnych
Możesz użyć potoku, aby przekazać wiele wartości binarnych w pierwszym argumencie:
SELECT MAKE_SET(1 | 4, 'a','b','c','d') Result;
Wynik:
+--------+ | Result | +--------+ | a,c | +--------+
Zauważ, że uzyskasz ten sam wynik, jeśli odwrócisz wartości binarne w pierwszym argumencie:
SELECT MAKE_SET(4 | 1, 'a','b','c','d') Result;
Wynik:
+--------+ | Result | +--------+ | a,c | +--------+
Wartości NULL
Żadne ciągi z wartościami NULL nie są dołączane do wyniku.
Przykład:
SELECT MAKE_SET(1 | 4, 'a','b',NULL,'d') Result;
Wynik:
+--------+ | Result | +--------+ | a | +--------+