Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách tạo RAND () Xác định trong SQL Server

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 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 |
+------------------+--------------------+-------------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không thể sử dụng nhà cung cấp OLE DB 'Microsoft.Jet.OLEDB.4.0' cho các truy vấn phân tán

  2. Khi nào bạn sẽ sử dụng một hàm giá trị bảng?

  3. Cách tạo ràng buộc khóa ngoại với tùy chọn ON DELETE SET NULL trong SQL Server - Hướng dẫn sử dụng SQL Server / TSQL Phần 81

  4. Không cập nhật được cơ sở dữ liệu .mdf vì cơ sở dữ liệu ở chế độ chỉ đọc (ứng dụng Windows)

  5. Cách nhập tệp JSON vào bảng SQL Server