RAND()
hàm trong SQL Server trả về giá trị float giả ngẫu nhiên từ 0 đến 1, độc quyền.
Hàm này có thể xác định hoặc không xác định, tùy thuộc vào cách nó được gọi.
Các hàm xác định luôn trả về cùng một kết quả cho một tập giá trị đầu vào nhất định và cho cùng một trạng thái của cơ sở dữ liệu. Các hàm không xác định có thể trả về một kết quả khác với cùng một bộ giá trị đầu vào và ngay cả khi trạng thái cơ sở dữ liệu vẫn giữ nguyên.
RAND()
hàm có thể được gọi theo hai cách; có hạt và không có hạt. Nếu bạn gọi nó mà không có hạt, nó không có tính xác định. Nếu bạn gọi nó bằng một hạt giống, nó mang tính xác định.
Nói cách khác, đối với một giá trị gốc được chỉ định, kết quả trả về luôn giống nhau.
Nhưng có một vấn đề:Đôi khi gọi RAND()
không có hạt giống là xác định. Tôi giải thích điều này bên dưới.
Cú pháp
Đầu tiên, đây là cú pháp:
RAND ( [ seed ] )
Dấu ngoặc vuông có nghĩa là đối số hạt giống là tùy chọn.
Ví dụ 1 - Không hạt giống
Ở đây tôi gọi là RAND()
năm lần không có hạt giống.
SELECT RAND() AS [No Seed] UNION ALL SELECT RAND() UNION ALL SELECT RAND() UNION ALL SELECT RAND() UNION ALL SELECT RAND()
Kết quả:
+-------------------+ | No Seed | |-------------------| | 0.2054995913191 | | 0.821844434880088 | | 0.4204955495022 | | 0.286702661673299 | | 0.394385747185196 | +-------------------+
Mỗi hàng có một giá trị khác nhau.
Ví dụ 2 - Với Seed
Ở đây tôi chạy cùng một truy vấn, ngoại trừ việc tôi thêm cùng một hạt giống vào mỗi lệnh gọi hàm.
SELECT RAND(100) AS [With Seed] UNION ALL SELECT RAND(100) UNION ALL SELECT RAND(100) UNION ALL SELECT RAND(100) UNION ALL SELECT RAND(100)
Kết quả:
+-------------------+ | With Seed | |-------------------| | 0.715436657367485 | | 0.715436657367485 | | 0.715436657367485 | | 0.715436657367485 | | 0.715436657367485 | +-------------------+
Trong trường hợp này, tất cả các hàng có cùng giá trị.
Ví dụ 3 - Kết hợp Hạt giống và Không Hạt giống trong cùng một truy vấn (Nhiều lệnh gọi RAND ())
Bạn cần cẩn thận khi gọi RAND()
nhiều lần trong cùng một kết nối. Nếu bạn gọi RAND()
với một giá trị gốc được chỉ định, tất cả các lệnh gọi tiếp theo của RAND()
tạo ra kết quả dựa trên RAND()
được gieo hạt gọi điện.
Vì vậy, bạn có thể vô tình nghĩ rằng bạn đang thực thi RAND()
không xác định trong khi thực tế thì không.
Đây là một ví dụ để chứng minh.
SELECT RAND(100) AS [With Seed], RAND() AS [No Seed], RAND() AS [No Seed] UNION ALL SELECT RAND(100) AS [With Seed], RAND() AS [No Seed], RAND() AS [No Seed] UNION ALL SELECT RAND(100) AS [With Seed], RAND() AS [No Seed], RAND() AS [No Seed];
Kết quả:
+-------------------+------------------+--------------------+ | With Seed | No Seed | No Seed | |-------------------+------------------+--------------------| | 0.715436657367485 | 0.28463380767982 | 0.0131039082850364 | | 0.715436657367485 | 0.28463380767982 | 0.0131039082850364 | | 0.715436657367485 | 0.28463380767982 | 0.0131039082850364 | +-------------------+------------------+--------------------+
Mặc dù giá trị kết quả khác nhau giữa các cột, nhưng mỗi lệnh gọi "không có hạt giống" thực sự dựa trên lệnh gọi "có hạt giống" và do đó, có tính xác định.
Nếu tôi xáo trộn các lệnh gọi hàm xung quanh, đây là những gì tôi nhận được.
SELECT RAND() AS [No Seed], RAND() AS [No Seed], RAND(100) AS [With Seed] UNION ALL SELECT RAND() AS [No Seed], RAND() AS [No Seed], RAND(100) AS [With Seed] UNION ALL SELECT RAND() AS [No Seed], RAND() AS [No Seed], RAND(100) AS [With Seed];
Kết quả:
+------------------+--------------------+-------------------+ | No Seed | No Seed | With Seed | |------------------+--------------------+-------------------| | 0.28769876521071 | 0.100505471175005 | 0.715436657367485 | | 0.28463380767982 | 0.0131039082850364 | 0.715436657367485 | | 0.28463380767982 | 0.0131039082850364 | 0.715436657367485 | +------------------+--------------------+-------------------+