No MariaDB,
MAKE_SET()
é uma função de string que retorna um valor definido, com base nos valores fornecidos em seus argumentos. Um conjunto é uma string contendo substrings separadas por vírgula (
,
) personagens. Sintaxe
A sintaxe fica assim:
MAKE_SET(bits,str1,str2,...)
Onde
str1, str2,...
é um ou mais valores de string e bits
especifica quais desses valores de string devem ser incluídos no conjunto. MAKE_SET()
retorna um valor definido que consiste nas strings que possuem o bit correspondente em bits
definir. Exemplo
Segue um exemplo para demonstrar:
SELECT MAKE_SET( 1, 'a', 'b', 'c', 'd' );
Resultado:
+-----------------------------------+ | MAKE_SET( 1, 'a', 'b', 'c', 'd' ) | +-----------------------------------+ | a | +-----------------------------------+
Observe que ele usa a representação binária do primeiro argumento para retornar as strings aplicáveis nos argumentos subsequentes. Portanto, não é tão simples dizer, o primeiro argumento foi 1 e então correspondeu ao item 1.
Aqui está outro exemplo que ilustra o que quero dizer:
SELECT MAKE_SET( 4, 'a', 'b', 'c', 'd' );
Resultado:
+-----------------------------------+ | MAKE_SET( 4, 'a', 'b', 'c', 'd' ) | +-----------------------------------+ | c | +-----------------------------------+
Como funciona
Considere o seguinte:
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';
Resultado (usando saída vertical):
1: 1 2: 10 3: 11 4: 100 5: 101 6: 110 7: 111 8: 1000 9: 1001 10: 1010
Aqui, eu uso o
BIN()
função para retornar o valor binário de cada número. Podemos ver que a representação binária de
4
é 100
. Precisamos visualizar isso de trás para frente para aplicá-lo ao nosso MAKE_SET()
exemplo acima. No nosso caso, este é um valor binário de três dígitos, com o dígito mais à direita correspondendo à primeira string, o próximo dígito corresponde à segunda string e o dígito mais à esquerda corresponde à terceira string. Em termos binários,
1
está "ligado" e 0
está fora". O MAKE_SET()
a função retorna apenas strings que possuem um 1
correspondente em seu valor binário. Portanto, nosso exemplo acima retorna a terceira string. Aqui está outro exemplo usando um valor diferente:
SELECT MAKE_SET(10, 'a','b','c','d');
Resultado:
+-------------------------------+ | MAKE_SET(10, 'a','b','c','d') | +-------------------------------+ | b,d | +-------------------------------+
Neste caso, o valor binário é
1010
. Portanto, tem dois 1
s, que correspondem ao segundo e quarto argumentos de string. Aqui estão mais alguns exemplos para demonstrar ainda mais o conceito:
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';
Resultado (usando saída vertical):
1: a 2: b 3: a,b 4: c 5: a,c 6: b,c 7: a,b,c 8: d 9: a,d 10: b,d
Aqui está um exemplo usando um conjunto diferente de strings:
SELECT MAKE_SET(3, 'Cat','Bat','Rat');
Resultado (usando saída vertical):
+--------------------------------+ | MAKE_SET(3, 'Cat','Bat','Rat') | +--------------------------------+ | Cat,Bat | +--------------------------------+
Vários valores binários
Use um símbolo de barra vertical (
|
) para incluir mais de um valor no conjunto:SELECT MAKE_SET( 1 | 4, 'Cat', 'Bat', 'Rat' );
Resultado:
+----------------------------------------+ | MAKE_SET( 1 | 4, 'Cat', 'Bat', 'Rat' ) | +----------------------------------------+ | Cat,Rat | +----------------------------------------+
Valores nulos
Se um valor de string for
null
, então é omitido do resultado:SELECT MAKE_SET( 1 | 3, 'Cat', null, 'Rat' );
Resultado:
+---------------------------------------+ | MAKE_SET( 1 | 3, 'Cat', null, 'Rat' ) | +---------------------------------------+ | Cat | +---------------------------------------+