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
*/
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 )
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:
Já o próximo trecho de código resulta no mesmo resultado, mas utilizando-se do nome da coluna que se deseja ordenar:
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.
domingo, 26 de maio de 2013
Cursor em SQL-Server (Números Primos)
Lembrando que um cursor deve ser usado somente quando não é possível resolver o que se necessita com apenas SELECT,
Para o nosso exemplo de Cursor, utilizo números que estão em uma "Tabela" e quero saber quais deles são primos.
Resultado:
DECLARE @ID INT
DECLARE @DESCRICAO VARCHAR(100)
DECLARE @DIVISOR INT
DECLARE @PRIMO BIT
--Declaração de um Cursor.
DECLARE CUR CURSOR FOR SELECT 1 ID,'Um' DESCRICAO UNION ALL
SELECT 2, 'Dois' UNION ALL
SELECT 3, 'Tres' UNION ALL
SELECT 4, 'Quatro' UNION ALL
SELECT 5, 'Cinco' UNION ALL
SELECT 6, 'Seis' UNION ALL
SELECT 7, 'Sete'
--Abrindo um Cursor para uso.
OPEN CUR
--Leitura da tupla do cursor dentro das variáveis
FETCH NEXT FROM CUR INTO @ID, @DESCRICAO
--Caso exista dados no Select do Cursor
WHILE @@FETCH_STATUS = 0
BEGIN
SET @PRIMO = 1 --Número é primo
SET @DIVISOR = @ID-1
WHILE @DIVISOR > 1
BEGIN
IF @ID % @DIVISOR = 0
BEGIN
SET @PRIMO = 0 --Número não é primo
BREAK
END
SET @DIVISOR = @DIVISOR -1
END
IF @PRIMO = 0 PRINT 'O número '+@DESCRICAO+' não é primo!'
ELSE PRINT 'O número '+@DESCRICAO+' é primo!'
--Leitura da tupla do cursor dentro das variáveis
FETCH NEXT FROM CUR INTO @ID, @DESCRICAO
END
--Fechando um cursor.
CLOSE CUR
--Liberando o cursor da memória (obrigatório)
DEALLOCATE CUR
Resultado:
O número Um é primo!
O número Dois é primo!
O número Tres é primo!
O número Quatro não é primo!
O número Cinco é primo!
O número Seis não é primo!
O número Sete é primo!
Assinar:
Postagens (Atom)