martedì 22 marzo 2011

SQLServer - istruzione POWER

Recentemente mi e' capitato di dover cercare in una tabella "users" di SQLServer gli utenti con delle autorizzazioni specifiche (esempio 3 e 4).

Ad esempio,
la tabella users potrebbe essere cosi' configurata:

id int: id utente
name varchar(255): nome utente
auth int: autorizzazione


...e con il seguente contenuto:

idnameauth
1Mario3(00001000)
2Luigi4(00010000)
3Toad5(00100000)

In questi casi e' da evitare la select di tutti i record (select * from users) e il successivo controllo dei singoli bit via codice.
La soluzione invece piu' razionale prevede una select in grado di estrarre i soli record che hanno i bit che ci interessano impostati a 1.

In questi casi lo statement POWER e' l'istruzione che fa al caso nostro e la seguente istruzione sql e' quella che ci serve:

SELECT id, name, auth FROM users WHERE (POWER(2, ISNULL(auth, 0)) & 24 != 0)


Una volta eseguita visualizzera' il seguente risultato:

idnameauth
1Mario3
2Luigi4

Istruzioni per creare la tabella:
CREATE TABLE [dbo].[users]( [id] [int] IDENTITY(1,1) NOT NULL, [name] [varchar](50) NOT NULL, [auth] [int] NULL, CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]