Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Marcos S.

Algarismo Romano - Ordenação lógica x Ordenação numérica

Recommended Posts

Olá pessoal, tudo tranquilo?

Gostaria de tirar uma dúvida com vocês...

Tenho um Banco de Dados com uma tabela onde contém um campo chamado "descricaoUnidade" do tipo VARCHAR(10), nela há conteúdo Algarismo Romano (I,II,III,IV,V...), como mostra abaixo...

 

Imagem Postada

 

Imagem Postada

 

Com esse conteúdo preciso ORDENAR de forma numerica e não alfabética, pois quando se utiliza a cláusula ORDER BY em um SELECT neste campo, a ordem logicamente fica de forma alfabética, ficando assim: I, II, III, IV, IX, V, VI, VII, VIII, X (ou seja, 1, 2, 3, 4, 9, 5, 6, 7, 8, 10). Ficando fora de ordem numérica.

Tenho uma aplicação onde preciso de uma Store Procedure (um SELECT que de alguma forma ordene o campo corretamente) para fazer tal feito. existe alguma função que faça isso?

 

Marcos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual a faixa que vai esta numeração de 1 (I) até quanto?

 

Teria um limite ou seria infinito.

 

Se não for infinito a principio se a faixa não for mto extensa seria criar uma função para converter de romano para númerico.

 

Uma outra maneira mais trabalhosa seria criar um tabela com use sequencial e a descrição em romano e fazer o relacionamento. você gravaria o sequencial e buscaria a equivalência em romano.

 

São algumas idéias que me vem a cabeça.

 

Pode ser que aqui no fórum o pessoal tenha alguma solução diferente.

 

Mas fica as sugestões.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não seria infinito, seria de 1 a 50 no max.

 

Como seria fazer um SELECT fazendo a conversão e mostrar os dados já ordenado? pois seria mais complicado criar uma tabela já que é uma faixa limitada...

 

 

Qual a faixa que vai esta numeração de 1 (I) até quanto?

 

Teria um limite ou seria infinito.

 

Se não for infinito a principio se a faixa não for mto extensa seria criar uma função para converter de romano para númerico.

 

Uma outra maneira mais trabalhosa seria criar um tabela com use sequencial e a descrição em romano e fazer o relacionamento. você gravaria o sequencial e buscaria a equivalência em romano.

 

São algumas idéias que me vem a cabeça.

 

Pode ser que aqui no fórum o pessoal tenha alguma solução diferente.

 

Mas fica as sugestões.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como disse uma forma seria criar uma função:

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [DBO].[CONVERTE_ROMANO](@VALOR VARCHAR(10))
RETURNS INT
AS
BEGIN
	DECLARE @RESULTADO INT
	
	SELECT @RESULTADO = CASE @VALOR
 	WHEN 'I' THEN 1
 	WHEN 'II' THEN 2
 	WHEN 'III' THEN 3
 	WHEN 'IV' THEN 4
 	
	END 
	
	RETURN @RESULTADO
END


Para testar:

SELECT DBO.CONVERTE_ROMANO('II')

Seria um trabalho braçal para colocar todos os valores ai você tem de ver o custo beneficio.

 

O outro seria cria uma tabela com seq e valor romano e fazer um INNER JOIN que tb daria o mesmo trabalho.

 

Agora o que você deve verificar é questão de performance no plano de execução.

 

Inicialmente você pode ir por um destes caminho.

 

Vamos ver o que os outros frequentadores do fórum sugerem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcos,

 

Você também poderia criar um campo de ordenação e ordenar por ele, poderia ser um campo smallint, onde você colocaria a ordem que deseja que os dados sejam mostrados e ordenar por ele, acho que ficaria mais fácil, a única desvantagem é que você irá ocupar um pouco mais de espaço no banco, mas se esta tabela nao for grande talves compense mais do que você criar funçoes para converter, por exemplo

 

descricaoUnidade (varchar(10))

ordenacaoUnidade (smallint)

 

I = 1

II = 2

III = 3

IV = 4

 

e assim por diante

 

Utilizo muito esta questão de ordenação desta maneira em minhas tabelas, oprque assim posso inclusive administrar a ordenação da forma que quizer.

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.