Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como a função MAKE_SET() funciona no MySQL


No MySQL, o MAKE_SET() A função retorna um valor definido (uma string contendo substrings separadas por , caracteres) consistindo nos caracteres especificados como argumentos quando você chama a função.

Ao chamar a função, você especifica qualquer número de strings (separados por uma vírgula), bem como um ou mais valores de bits que determinam quais strings devem ser retornadas no valor definido.


Sintaxe


A sintaxe fica assim:
MAKE_SET(bits,str1,str2,...)

Exemplo


Segue um exemplo básico:
SELECT MAKE_SET(1, 'a','b','c','d') Result;

Resultado:
+--------+
| Result |
+--------+
| a      |
+--------+

Esse resultado pode parecer óbvio à primeira vista. Afinal, nosso primeiro argumento é 1 , e a função retorna a primeira string.

No entanto, não é bem assim que funciona.

Aqui está outro exemplo.
SELECT MAKE_SET(4, 'a','b','c','d') Result;

Resultado:
+--------+
| Result |
+--------+
| c      |
+--------+

Observe que ele retornou a terceira string, embora tenhamos especificado 4 como o primeiro argumento?

Isso ocorre porque o MAKE_SET() função usa a representação binária do primeiro argumento para retornar as strings aplicáveis ​​nos argumentos subsequentes.

Veja o exemplo de código a seguir para ver o que quero dizer:
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:
+------+------+------+------+------+------+------+------+------+------+
| 1    | 2    | 3    | 4    | 5    | 6    | 7    | 8    | 9    | 10   |
+------+------+------+------+------+------+------+------+------+------+
| 1    | 10   | 11   | 100  | 101  | 110  | 111  | 1000 | 1001 | 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') Result;

Resultado:
+--------+
| Result |
+--------+
| 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:
+---+---+-----+---+-----+-----+-------+---+-----+-----+
| 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 |
+---+---+-----+---+-----+-----+-------+---+-----+-----+

E aqui está um exemplo usando um conjunto diferente de strings:
SELECT MAKE_SET(5, 'Cat','Dog','Horse','Duck') Result;

Resultado:
+-----------+
| Result    |
+-----------+
| Cat,Horse |
+-----------+

Vários valores binários


Você pode usar um pipe para passar vários valores binários no primeiro argumento:
SELECT MAKE_SET(1 | 4, 'a','b','c','d') Result;

Resultado:
+--------+
| Result |
+--------+
| a,c    |
+--------+

Observe que você obterá o mesmo resultado se inverter os valores binários no primeiro argumento:
SELECT MAKE_SET(4 | 1, 'a','b','c','d') Result;

Resultado:
+--------+
| Result |
+--------+
| a,c    |
+--------+

Valores NULOS


Quaisquer strings com valores NULL não são anexadas ao resultado.

Exemplo:
SELECT MAKE_SET(1 | 4, 'a','b',NULL,'d') Result;

Resultado:
+--------+
| Result |
+--------+
| a      |
+--------+