Tenho números salvos como VARCHAR
um banco de dados MySQL. Não posso fazê-los INT
devido a outras circunstâncias dependentes.
Ele está tomando como caractere e não como número durante a classificação.
No banco de dados eu tenho
1 2 3 4 5 6 7 8 9 10...
Na minha página, mostra a lista ordenada como esta:
1 10 2 3 4 5 6 7 8 9
Como posso fazer com que pareça ordenado por números ascendentes?
Respostas:
Se possível, você deve alterar o tipo de dados da coluna para um número, se você só armazenar números de qualquer maneira.
Se você não puder fazer isso, converta o valor da coluna para um
integer
explicitamente comou implicitamente, por exemplo, com uma operação matemática que força uma conversão para número
BTW MySQL converte strings da esquerda para a direita. Exemplos:
fonte
1
decimal
.Outra maneira, sem usar um único elenco.
(Para pessoas que usam o JPA 2.0, onde nenhuma transmissão é permitida)
EDIT: funciona apenas para números inteiros positivos
fonte
Outra maneira simples
ORDER BY ABS(column_name)
fonte
A coluna com a qual estou classificando tem qualquer combinação de alfa e numérica, por isso usei as sugestões nesta postagem como ponto de partida e criei isso.
Resultados
Espero que isto ajude
fonte
1 - ISNUMERIC(ID)
vez de(CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END)
mudar de 0 para 1 e vice-versa.Isso funciona para mim.
fonte
Outra maneira de converter.
Se você tiver um campo de string, poderá transformá-lo ou sua parte numérica da seguinte maneira: adicione zeros à esquerda para fazer com que todas as strings inteiras tenham o mesmo comprimento.
ou encomende por parte de um campo algo como 'tensymbols13', 'tensymbols1222' etc.
fonte
Eu estava procurando também um campo de classificação com prefixo de letra. Aqui está o que eu descobri a solução. Isso pode ajudar quem está procurando a mesma solução.
Valores do campo:
SUBSTRING(field,3,9)
Eu coloquei 9 porque 9 é o suficiente para eu manter no máximo 9 dígitos com valores inteiros.Portanto, o resultado será 123456789 123456788 123456787 ... 100 99 ... 2 1
fonte
Isso manipulará números negativos, frações, string, tudo:
fonte
Pode ajudar quem está procurando a mesma solução.
fonte
Se você estiver usando o AdonisJS e tiver IDs mistos como ABC-202, ABC-201 ..., poderá combinar consultas brutas com o Query Builder e implementar a solução acima ( https://stackoverflow.com/a/25061144/4040835 ) do seguinte modo:
NOTAS: Nesta linha:
SUBSTRING(:sortField:,3,15)*1 ${sortDirection}
,Ref 1: Você pode ler mais sobre ligações de parâmetros em consultas brutas aqui: https://knexjs.org/#Raw-Bindings Ref 2: consultas brutas do Adonis: https://adonisjs.com/docs/4.1/query-builder# _raw_queries
fonte
Altere seu campo para INT em vez de VARCHAR.
Em seguida, corrija as circunstâncias dependentes primeiro. Caso contrário, você está solucionando o problema subjacente real. Usar um MySQL CAST é uma opção, mas está mascarando seu esquema inválido, que deve ser corrigido.
fonte