Estou tentando ordenar por uma coluna de número em meu banco de dados que tem valores 1-999
Quando eu uso
ORDER_BY registration_no ASC
Eu recebo….
1
101
102
103
104
105
106
107
108
109
11
110
Etc…
Portanto, parece estar ordenando pelo primeiro dígito em oposição ao número.
Alguém sabe qual SQL usar se quiser ordenar por valor? Então 1,2,3,4,5,6
etc
sql
sql-order-by
Konnor262
fonte
fonte
order by registration_no + 0 asc
para resolver seu problema.Respostas:
Uma maneira de ordenar por números inteiros positivos, quando eles são armazenados como
varchar
, é ordenar primeiro pelo comprimento e depois pelo valor:Isso é particularmente útil quando a coluna pode conter valores não numéricos.
Nota: em alguns bancos de dados, a função para obter o comprimento de uma string pode ser chamada em
length()
vez delen()
.fonte
order by
tem pouco efeito no desempenho.length()
vez delen()
converte explicitamente o valor em um número. Outra possibilidade de conseguir o mesmo seria
o que forçará uma conversa implícita.
Na verdade, você deve verificar a definição da tabela e alterá-la. Você pode alterar o tipo de dados para
int
assimALTER TABLE your_table MODIFY COLUMN registration_no int;
fonte
Se você estiver usando o SQL Server:
fonte
dá o resultado desejado com avisos.
Portanto, é melhor ir para
para um resultado limpo sem nenhum aviso SQL.
fonte
Presumo que seu tipo de coluna seja STRING (CHAR, VARCHAR, etc) e o procedimento de classificação é classificá-lo como uma string. O que você precisa fazer é converter o valor em valor numérico. Como fazer isso dependerá do sistema SQL que você usa.
fonte
Às vezes, você simplesmente não tem a opção de armazenar números misturados com texto. Em um de nossos aplicativos, o host do site que usamos para nosso site de comércio eletrônico cria filtros dinamicamente fora das listas. Não há opção de classificar por qualquer campo, exceto pelo texto exibido. Quando queríamos filtros construídos a partir de uma lista que dizia coisas como 2 "a 8" 9 "a 12" 13 "a 15" etc., precisávamos classificar 2-9-13, não 13-2-9 como acontecerá quando lendo os valores numéricos. Portanto, usei a função Replicar do SQL Server junto com o comprimento do número mais longo para preencher quaisquer números mais curtos com um espaço à esquerda. Agora, 20 é classificado após 3 e assim por diante.
Eu estava trabalhando com uma visão que me dava os comprimentos, larguras, etc. mínimos e máximos para o tipo de item e classe, e aqui está um exemplo de como fiz o texto. (LB n Low e LB n High são as extremidades inferior e superior dos 5 suportes de comprimento.)
fonte
Prefiro fazer um “PAD” nos dados. O MySql o chama de LPAD, mas você pode trabalhar para fazer a mesma coisa no SQL Server.
ORDER BY REPLACE(STR(ColName, 3), SPACE(1), '0')
Esta fórmula fornecerá zeros à esquerda com base no comprimento da coluna de 3. Essa funcionalidade é muito útil em outras situações fora de ORDER BY, por isso eu queria fornecer essa opção.
Resultados: 1 torna-se 001 e 10 torna-se 010, enquanto 100 permanece o mesmo.
fonte
Este problema ocorre porque você declarou a coluna no tipo de dados CHAR, VARCHAR ou TEXT. Basta alterar o tipo de dados para INT, BIGINT etc. Isso resolverá o problema de seu pedido personalizado.
fonte