В MySQL, MAKE_SET()
функцията връща зададена стойност (низ, съдържащ поднизове, разделени с ,
символи), състояща се от знаците, посочени като аргументи, когато извикате функцията.
Когато извикате функцията, посочвате произволен брой низове (разделени със запетая), както и една или повече битови стойности, които определят кои низове да се върнат в зададената стойност.
Синтаксис
Синтаксисът е така:
MAKE_SET(bits,str1,str2,...)
Пример
Ето един основен пример:
SELECT MAKE_SET(1, 'a','b','c','d') Result;
Резултат:
+--------+ | Result | +--------+ | a | +--------+
Този резултат може да изглежда очевиден в началото. В крайна сметка първият ни аргумент е 1
, а функцията връща първия низ.
Това обаче не е точно как работи.
Ето още един пример.
SELECT MAKE_SET(4, 'a','b','c','d') Result;
Резултат:
+--------+ | Result | +--------+ | c | +--------+
Забележете, че върна третия низ, въпреки че посочихме 4
като първи аргумент?
Това е така, защото MAKE_SET()
функцията използва двоичното представяне на първия аргумент, за да върне приложимите низове в следващите аргументи.
Вижте следния пример за код, за да видите какво имам предвид:
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';
Резултат:
+------+------+------+------+------+------+------+------+------+------+ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | +------+------+------+------+------+------+------+------+------+------+ | 1 | 10 | 11 | 100 | 101 | 110 | 111 | 1000 | 1001 | 1010 | +------+------+------+------+------+------+------+------+------+------+
Тук използвам BIN()
функция за връщане на двоичната стойност на всяко число.
Можем да видим, че двоичното представяне на 4
е 100
. Трябва да визуализираме това назад, за да го приложим към нашия MAKE_SET()
пример по-горе. В нашия случай това е трицифрена двоична стойност, като най-дясната цифра съответства на първия низ, следващата цифра съответства на втория низ, а най-лявата цифра съответства на третия низ.
В двоични термини, 1
е „включено“ и 0
е изключен". MAKE_SET()
функцията връща само низове, които имат съответен 1
в тяхната двоична стойност. Следователно нашият пример по-горе връща третия низ.
Ето още един пример, използващ различна стойност:
SELECT MAKE_SET(10, 'a','b','c','d') Result;
Резултат:
+--------+ | Result | +--------+ | b,d | +--------+
В този случай двоичната стойност е 1010
. Следователно има две 1
s, които съответстват на втория и четвъртия аргумент на низа.
Ето още няколко примера за по-нататъшно демонстриране на концепцията:
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';
Резултат:
+---+---+-----+---+-----+-----+-------+---+-----+-----+ | 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 | +---+---+-----+---+-----+-----+-------+---+-----+-----+
И ето пример за използване на различен набор от низове:
SELECT MAKE_SET(5, 'Cat','Dog','Horse','Duck') Result;
Резултат:
+-----------+ | Result | +-----------+ | Cat,Horse | +-----------+
Множество двоични стойности
Можете да използвате тръба, за да предадете множество двоични стойности в първия аргумент:
SELECT MAKE_SET(1 | 4, 'a','b','c','d') Result;
Резултат:
+--------+ | Result | +--------+ | a,c | +--------+
Имайте предвид, че ще получите същия резултат, ако обърнете двоичните стойности в първия аргумент:
SELECT MAKE_SET(4 | 1, 'a','b','c','d') Result;
Резултат:
+--------+ | Result | +--------+ | a,c | +--------+
NULL стойности
Всички низове със стойности NULL не се добавят към резултата.
Пример:
SELECT MAKE_SET(1 | 4, 'a','b',NULL,'d') Result;
Резултат:
+--------+ | Result | +--------+ | a | +--------+