sábado, 27 de julho de 2013

Brincando com os operadores de comparação ( ANY | SOME e ALL )

Vou apresentar desta vez operadores de comparação que muitos desconhecem, são eles: ( ANY |SOME e ALL )


DECLARE @TABELA TABLE(ID INT)
INSERT INTO @TABELA SELECT 1
              UNION SELECT 2 
              UNION SELECT 3
              UNION SELECT 4

--ANY retorna verdadeiro comparando por QUALQUER valor de um Conjunto
IF 2 < ANY(SELECT ID FROM @TABELA)
BEGIN
   PRINT '2 É MENOR QUE QUALQUER VALOR DA TABELA'
END

--SOME retorna verdadeiro comparando por ALGUM valor de um Conjunto
IF 2 < SOME(SELECT ID FROM @TABELA)
BEGIN
   PRINT '2 É MENOR QUE ALGUM VALOR DA TABELA'
END

--ALL retorna verdadeiro comparando por TODOS valores de um Conjunto
IF 0 < ALL(SELECT ID FROM @TABELA)
BEGIN
   PRINT '0 É MENOR QUE TODOS OS VALORES DA TABELA'
END

--CURIOSIDADES: EQUIVALENCIA ANY E IN

--Trazer dados de @TABELA que seja IGUAL a QUALQUER valor do Conjunto
SELECT * 
  FROM @TABELA 
 WHERE ID = ANY(SELECT 1 UNION SELECT 2 UNION SELECT 5)

--Trazer dados de @TABELA que seja valores CONTIDOS num Conjunto
SELECT * 
  FROM @TABELA 
 WHERE ID IN(SELECT 1 UNION SELECT 2 UNION SELECT 5)
/*
Resultado em ambos os casos
ID
-----------
1
2
*/
--CURIOSIDADES: EQUIVALENCIA ALL e NOT IN
--Trazer dados de @TABELA que seja diferente de TODOS valores do Conjunto
SELECT * 
  FROM @TABELA 
 WHERE ID <> ALL(SELECT 1 UNION SELECT 2 UNION SELECT 5)

--Trazer dados de @TABELA que seja valores NAO CONTIDOS em um Conjunto
SELECT *  
  FROM @TABELA 
 WHERE ID NOT IN (SELECT 1 UNION SELECT 2 UNION SELECT 5)
/*
Resultado em ambos os casos
ID
-----------
3
4
*/

quinta-feira, 4 de julho de 2013

SQL Server - Order By Dinâmico

Vamos a outra brincadeira com SQL-Server Em alguns sistemas existe a característica de ordenação conforme click na coluna Header, então segue um exemplo que diz respeito a este tratamento usando Banco de Dados SQL-Server
Com o trecho abaixo pode ser informado qual o número da coluna que se deseja ordenar:


DECLARE @TABELA TABLE(ID        INTEGER
                    , DESCRICAO VARCHAR(100)
                    , CADASTRO  DATETIME
                    , IDADE     INTEGER
                    , SITUACAO CHAR(1))
DECLARE @ORDERBY INTEGER

--LEGENDA DE ORDENACAO:
--[1 - ID]       
--[2 - DESCRICAO]      
--[3 - CADASTRO]      
--[4 - IDADE]         
--[5 - SITUACAO]
SET @ORDERBY = 1

INSERT INTO @TABELA VALUES(1, 'Z', '01-01-2013 00:00:00', 10, 'A')
INSERT INTO @TABELA VALUES(2, 'X', '03-03-2013 00:00:00', 40, 'I')
INSERT INTO @TABELA VALUES(3, 'Y', '02-02-2013 00:00:00', 30, 'A')

  SELECT ID, DESCRICAO, CADASTRO, IDADE, SITUACAO
    FROM @TABELA
ORDER BY CASE --ORDENAÇÃO NUMÉRICA
            WHEN @ORDERBY = 1 THEN ID            
            WHEN @ORDERBY = 3 THEN CADASTRO
            WHEN @ORDERBY = 4 THEN IDADE
         END
        ,CASE --ORDENAÇÃO NÃO NUMÉRICA
            WHEN @ORDERBY = 2 THEN DESCRICAO
            WHEN @ORDERBY = 5 THEN SITUACAO
         END


Já o próximo trecho de código resulta no mesmo resultado, mas utilizando-se do nome da coluna que se deseja ordenar:


DECLARE @TABELA TABLE(ID        INTEGER
                    , DESCRICAO VARCHAR(100)
                    , CADASTRO  DATETIME
                    , IDADE     INTEGER
                    , SITUACAO CHAR(1))
DECLARE @ORDERBY VARCHAR(20)

SET @ORDERBY = 'SITUACAO'

INSERT INTO @TABELA VALUES(1, 'Z', '01-01-2013 00:00:00', 10, 'A')
INSERT INTO @TABELA VALUES(2, 'X', '03-03-2013 00:00:00', 40, 'I')
INSERT INTO @TABELA VALUES(3, 'Y', '02-02-2013 00:00:00', 30, 'A')

  SELECT ID, DESCRICAO, CADASTRO, IDADE, SITUACAO
    FROM @TABELA
ORDER BY CASE --ORDENAÇÃO NUMÉRICA
            WHEN @ORDERBY = 'ID'        THEN ID            
            WHEN @ORDERBY = 'CADASTRO ' THEN CADASTRO
            WHEN @ORDERBY = 'IDADE'     THEN IDADE
         END
        ,CASE --ORDENAÇÃO NÃO NUMÉRICA
            WHEN @ORDERBY = 'DESCRICAO' THEN DESCRICAO
            WHEN @ORDERBY = 'SITUACAO'  THEN SITUACAO
         END
Pode-se transformar estes trechos de código em stored procedures onde tem como parâmetro de entrada a variável @ORDERBY.