diumenge, 11 de febrer de 2018

Nombres aleatoris T-Sql

Tornem a l'SQL Server.
Avui veurem com generar números aleatoris diferents en una consulta.

Si executem:
select o.object_id, rand() as random
from sys.objects o

Veiem que el valor de random sempre és el mateix per a tots els objectes, però nosaltres volem un valor diferent per a cadascun.



La funció Rand (https://docs.microsoft.com/en-us/sql/t-sql/functions/rand-transact-sql) ens permet posar un seed, per al mateix seed el valor aleatori sempre és el mateix.

select o.object_id, rand(o.object_id) as random
from sys.objects o

En aquest cas tenim números diferents per a cada fila, però, per exemple, sempre que tinguem l'objecte 3 el nombre retornat serà: 0,71362925915544 i això és poc aleatori...






Necessitem passar-li un seed aleatori a la funció Rand, per això podem utilitzar la funció NEWID() que genera un uniqueidentifier diferent per a cada registre. Per convertir el uniqueidentifier a enter primer hem de passar a varbinary amb un convert i, finalment, fer un cast.

select o.object_id, rand(cast(CONVERT(VARBINARY(16), newid(), 2) as int)) as random
from sys.objects o

I ara sí que tenim valors aleatoris per a cadascun dels registres.


Per cert, si voleu trastejar amb el SQL Server i alguns altres RDMS sense haver d'instal·lar-los podeu provar les webs: http://sqlfiddle.com/ o http://rextester.com/l/sql_server_online_compiler

Cap comentari:

Publica un comentari a l'entrada