Forçar ordem numérica em uma coluna varchar do SQL Server 2005, contendo letras e números?

StackOverflow https://stackoverflow.com/questions/75361

  •  09-06-2019
  •  | 
  •  

Pergunta

Tenho uma coluna contendo as strings 'Operador (1)' e assim por diante até 'Operador (600)' até o momento.

Quero ordená-los numericamente e descobri

select colname from table order by 
cast(replace(replace(colname,'Operator (',''),')','') as int)

o que é muito feio.

Melhores sugestões?

Foi útil?

Solução

É isso, InStr()/SubString(), mudando Operador(1) para Operador(001), armazenando o n em Operador(n) separadamente, ou criando uma coluna computada que esconde a feia manipulação de strings.O que você tem parece bom.

Outras dicas

Se você realmente ter para deixar os dados no formato que você possui - e adicionar uma coluna de ordem de classificação numérica é a melhor solução - considere agrupar a manipulação de texto em uma função definida pelo usuário.

selecione colname na ordem da tabela por dbo.udfSortOperator (colname)

É menos feio e oferece alguma abstração.Há uma sobrecarga adicional na chamada de função, mas em uma tabela contendo poucos milhares de linhas em um servidor de banco de dados não muito atingido, isso não é uma grande preocupação.Faça anotações na função para otimizar posteriormente, conforme necessário.

Minha resposta seria mudar o problema.Eu adicionaria um campo operatorNumber à tabela, se isso fosse possível.Altere as rotinas de atualização/inserção para extrair o número e armazená-lo.Dessa forma, o acerto de conversão de string ocorre apenas uma vez por registro.

A lógica de ordenação exigiria a conversão da string sempre que a consulta fosse executada.

Bem, primeiro defina o significado dessa coluna.O operador é um nome para que você possa justificar o uso de caracteres?Ou é um número?

Se o campo for um nome, você usará caracteres e deverá determinar o comprimento fixo.Preencha todos os nomes de operadores com zeros à esquerda.Definir regras de nomenclatura para operadores (I.E.Sem cartas.Ou os códigos que você usaria em uma série como "A001")

Um índice classificará os dados físicos no servidor.E uma nomenclatura de texto definida corretamente irá classificá-los em uma consulta.Você iria querer os dois.

Se o operador for um número, você errou no tipo de dados dessa coluna e precisa ser alterado.

Coluna computada indexada

Se você estiver fazendo um pedido ou consultando operator coluna frequentemente, considere criar uma coluna computada para seu valor numérico e adicionar um índice para ela.Isso lhe dará uma coluna computada/persistente (que parece um oxímoro, mas não é).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top