Trong MySQL, MAKE_SET()
hàm trả về một giá trị đã đặt (một chuỗi chứa các chuỗi con được phân tách bằng ,
ký tự) bao gồm các ký tự được chỉ định làm đối số khi bạn gọi hàm.
Khi bạn gọi hàm, bạn chỉ định bất kỳ số lượng chuỗi nào (được phân tách bằng dấu phẩy), cũng như một hoặc nhiều giá trị bit xác định chuỗi nào sẽ trả về trong giá trị đã đặt.
Cú pháp
Cú pháp như sau:
MAKE_SET(bits,str1,str2,...)
Ví dụ
Đây là một ví dụ cơ bản:
SELECT MAKE_SET(1, 'a','b','c','d') Result;
Kết quả:
+--------+ | Result | +--------+ | a | +--------+
Kết quả này thoạt nghe có vẻ rõ ràng. Rốt cuộc, đối số đầu tiên của chúng ta là 1
và hàm trả về chuỗi đầu tiên.
Tuy nhiên, đó không phải là cách nó hoạt động.
Đây là một ví dụ khác.
SELECT MAKE_SET(4, 'a','b','c','d') Result;
Kết quả:
+--------+ | Result | +--------+ | c | +--------+
Lưu ý rằng nó trả về chuỗi thứ ba, mặc dù chúng tôi đã chỉ định 4
là đối số đầu tiên?
Điều này là do MAKE_SET()
hàm sử dụng biểu diễn nhị phân của đối số đầu tiên để trả về các chuỗi có thể áp dụng trong các đối số tiếp theo.
Hãy xem ví dụ mã sau để hiểu ý tôi:
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';
Kết quả:
+------+------+------+------+------+------+------+------+------+------+ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | +------+------+------+------+------+------+------+------+------+------+ | 1 | 10 | 11 | 100 | 101 | 110 | 111 | 1000 | 1001 | 1010 | +------+------+------+------+------+------+------+------+------+------+
Ở đây, tôi sử dụng BIN()
hàm để trả về giá trị nhị phân của mỗi số.
Chúng ta có thể thấy rằng biểu diễn nhị phân của 4
là 100
. Chúng tôi cần hình dung ngược điều này để áp dụng nó cho MAKE_SET()
của chúng tôi ví dụ trên. Trong trường hợp của chúng tôi, đây là giá trị nhị phân có ba chữ số, với chữ số tận cùng bên phải tương ứng với chuỗi đầu tiên, chữ số tiếp theo tương ứng với chuỗi thứ hai và chữ số ngoài cùng bên trái tương ứng với chuỗi thứ ba.
Theo thuật ngữ nhị phân, 1
là “bật” và 0
No tăt rôi". MAKE_SET()
hàm chỉ trả về các chuỗi có 1
tương ứng trong giá trị nhị phân của chúng. Do đó, ví dụ của chúng tôi ở trên trả về chuỗi thứ ba.
Dưới đây là một ví dụ khác sử dụng một giá trị khác:
SELECT MAKE_SET(10, 'a','b','c','d') Result;
Kết quả:
+--------+ | Result | +--------+ | b,d | +--------+
Trong trường hợp này, giá trị nhị phân là 1010
. Do đó, nó có hai 1
s, tương ứng với đối số chuỗi thứ hai và thứ tư.
Dưới đây là một số ví dụ khác để minh chứng thêm cho khái niệm này:
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';
Kết quả:
+---+---+-----+---+-----+-----+-------+---+-----+-----+ | 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 | +---+---+-----+---+-----+-----+-------+---+-----+-----+
Và đây là một ví dụ sử dụng một nhóm chuỗi khác:
Kết quảSELECT MAKE_SET(5, 'Cat','Dog','Horse','Duck') Result;
Kết quả:
+-----------+ | Result | +-----------+ | Cat,Horse | +-----------+
Nhiều giá trị nhị phân
Bạn có thể sử dụng một đường ống để chuyển nhiều giá trị nhị phân trong đối số đầu tiên:
SELECT MAKE_SET(1 | 4, 'a','b','c','d') Result;
Kết quả:
+--------+ | Result | +--------+ | a,c | +--------+
Lưu ý rằng bạn sẽ nhận được kết quả tương tự nếu đảo ngược các giá trị nhị phân trong đối số đầu tiên:
SELECT MAKE_SET(4 | 1, 'a','b','c','d') Result;
Kết quả:
+--------+ | Result | +--------+ | a,c | +--------+
Giá trị NULL
Bất kỳ chuỗi nào có giá trị NULL không được nối vào kết quả.
Ví dụ:
Kết quảSELECT MAKE_SET(1 | 4, 'a','b',NULL,'d') Result;
Kết quả:
+--------+ | Result | +--------+ | a | +--------+