sábado, 30 de marzo de 2013

Pattern Matching in Search Conditions

Pattern Matching in Search Conditions


Normalmente usamos LIKE con el símbolo % para indicar que nuestra búsqueda deberá coincidir hasta cierto punto.
El siguiente ejemplo 
SELECT  [EmployeeID]
      ,[LastName]
      ,[FirstName]
      ,[MiddleInitial]
      ,[SSN]
  FROM [Employee]
  WHERE LastName LIKE 'Ste%'
Retornará 

EmployeeID  LastName                       FirstName                     MiddleInitial SSN
----------- ------------------------------ ----------------------------- ------------- -----------
1           Stein                          Nidprxmvtyjnat                              123-07-9951
14          Stein                          Qfgakkjblwfbkb                              763-07-9431
27          Stein                          Ysscitlqms                                  590-07-8911
40          Stein                          Txhqy                                       437-07-8391

Pero el signo % no es el único que podemos usar. SQL server incluye los siguientes comodines.

Wildcard
Comportamiento
%
Cualquier string de cero o más caracteres.
_
Un caracter solamente.
[ ]
Un rango.
[^]
Un caracter que no este dentro del rango

 
En la siguiente condición SSN deberá no iniciarse con "1", en la siguiente posición deberá existir un número comprendido entre 0 y 9, la tercera posición deberá ser un número comprendido entre 4 y 8, en las siguientes 4 posiciones podrá ser cualquier cosa, pero a continuación deberá ser solamente un "9", el resto no nos interesa.  

SELECT  [EmployeeID]
      ,[LastName]
      ,[FirstName]
      ,[MiddleInitial]
      ,[SSN]
  FROM [Employee]
  WHERE SSN LIKE '[^1][0-9][4-8]____9%'

Este será el resultado

EmployeeID  LastName                       FirstName                     MiddleInitial SSN
----------- ------------------------------ ----------------------------- ------------- -----------
2           Eflin                          Ysgphbplbhoksy                              327-07-9911
7           Makai                          Lnudwgnbtoyvix                              467-07-9711
24          Infante                        Raluqhoqtkd                                 967-07-9031
251         Stein                          Nidprxmvtyjnat                              247-06-9951
255         Olphant                        Tqbigir                                     857-06-9791


Comparison Operators Modified by ANY, SOME, or ALL

Comparison Operators Modified by ANY, SOME, or ALL


El operador IN nos permite saber si un valor se encuentra en un conjunto de valores. Normalmente lo usamos en el WHERE. 

Por ejemplo 

  SELECT  [EmployeeID]
      ,[LastName]
      ,[FirstName]
      ,[MiddleInitial]
      ,[SSN]
  FROM [Employee]
  WHERE LastName IN ('Stein','Chen')

Nos retorna 
EmployeeID  LastName                       FirstName                     MiddleInitial SSN
----------- ------------------------------ ----------------------------- ------------- -----------
1           Stein                          Nidprxmvtyjnat                              123-07-9951
4           Chen                           Mju                                         750-07-9831
14          Stein                          Qfgakkjblwfbkb                              763-07-9431
17          Chen                           Jdjoemmumy                                  733-07-9311
27          Stein                          Ysscitlqms                                  590-07-8911
30          Chen                           Eyeqkrvwoewil                               327-07-8791

Los otro operadores de conjuntos que provee SQL son ALLSOME ANY

ANY retorna verdadero si la comparación se cumple para alguno del conjunto. Es lo mismo que IN.

   SELECT  [EmployeeID]
      ,[LastName]
      ,[FirstName]
      ,[MiddleInitial]
      ,[SSN]
  FROM [Employee]
  WHERE LastName = ANY (
SELECT 'Stein'
UNION
SELECT 'Chen')

ALL retorna verdadero si la condición se cumple para todo el conjunto

En el siguiente ejemplo ALL retornará los menores a 4, ya que los mismos son menores a 4 y a 8

   SELECT  [EmployeeID]
      ,[LastName]
      ,[FirstName]
      ,[MiddleInitial]
      ,[SSN]
  FROM [Employee]
  WHERE EmployeeID <= ALL 
SELECT 8
UNION
SELECT 4
) 


EmployeeID  LastName                       FirstName                     MiddleInitial SSN
----------- ------------------------------ ----------------------------- ------------- -----------
1           Stein                          Nidprxmvtyjnat                              123-07-9951
2           Eflin                          Ysgphbplbhoksy                              327-07-9911
3           Quint                          Ysoawvtycuwv                                593-07-9871
4           Chen                           Mju                                         750-07-9831

(4 row(s) affected)




Building a SQL Server Inventory

Building a SQL Server Inventory


User with last access


User with last access

select name, updatedate , accdate, case when sysadmin = 1 then 'sa' else '' end as rol , lastProcessfrom syslogins lleft join (select loginame, max(last_batch) lastProcess from master..sysprocesses group by loginame) a on a.loginame = l.nameorder by  lastprocess  desc, accdate desc