Eu tenho um banco de dados com uma coluna VARCHAR que contém números inteiros de comprimento variável. Quero classificá-los para que 10 venha após 9, não 1, e 70A venha após 70. Consegui fazer isso com as instruções PATINDEX () , CTE e CASE na cláusula WHERE.
No entanto, eu queria saber se havia um agrupamento onde isso seria desnecessário.
sql-server
collation
sorting
natural-sort
Justin Dearing
fonte
fonte
Respostas:
Não. O agrupamento refere-se à classificação alfabética, dependendo da página de código, acento, caixa, largura e kana. Os caracteres numéricos (0 a 9) não possuem propriedades.
Assim
9
é sempre depois10B
de qualquer tipo.Você deve dividir como anotou
ou classificar assim:O comprimento à direita determina quantos espaços você tem.Você poderia, é claro:
justificar à direita em um caractere (uma versão armazenada do meu DIREITO acima)As duas últimas sugestões são como o meu DIREITO acima e um pouco diferente. Classificação mais rápida (não é necessário processamento do colukmn), mas é necessário mais armazenamento
fonte
9
é sempre depois10B
de qualquer tipo ": é apenas dessa maneira no SQL Server porque a opção de classificação subjacente para manipular "DigitsAsNumbers" não foi exposta como uma opção de Agrupamento. Ainda ;-). Isso ficou disponível para aplicativos baseados no Windows a partir do Windows 7, principalmente no File Explorer. E pode um dia ser exposto ao SQL Server, se pessoas suficientes apoiarem a ideia. Tentei fazer a bola rolar preenchendo a seguinte sugestão do Connect: Suporte "classificação natural" / DIGITSASNUMBERS como uma opção de agrupamento .Eu configuraria uma coluna computada e depois classificaria com base nisso. Algo como
Em seguida, use esta coluna para classificar, pois agora você pode indexar a coluna.
fonte
Se você quiser uma maneira dolorosa de provar o que o @gbn está dizendo (essencialmente que você não pode dizer a um agrupamento para ordenar substrings de maneira diferente), crie uma tabela rápida #temp que tenha um coeficiente para o pedido que você espera e veja se ordenar por qualquer agrupamento retorna a mesma ordem:
Isso funciona para mim em cerca de 10 segundos e produz 0 linhas - o que significa que nenhum agrupamento disponível para o SQL Server (pelo menos 2008 R2, ainda não experimentou o Denali) será classificado da maneira que você espera. Você precisa de uma maneira diferente de definir a classificação.
fonte
Deseja um meio sensato e eficiente de classificar números em strings como números reais? Considere votar na minha sugestão do Microsoft Connect: Suporte "classificação natural" / DIGITSASNUMBERS como uma opção de agrupamento
Embora esta pergunta seja específica do SQL Server e essa resposta não, achei que ainda deveria postar essas informações simplesmente para conscientizá-las e não para opor-me a qualquer outra resposta.
Dito isto, fora do SQL Server, em certos ambientes, é possível fazer esse tipo de classificação. É algo que é pelo menos especificado na documentação Unicode. No padrão / relatório UNICODE LOCALE MARKUP LANKUAGE (LDML) PARTE 5: COLLATION , há um gráfico para Configurações de agrupamento que descreve várias opções para personalizar o comportamento de classificação. Uma das opções é
-kn-true
ou[numericOrdering on]
:No entanto, este documento é um "padrão técnico" e não faz parte da especificação principal do Unicode. Uma observação na parte superior do documento afirma:
Portanto, esse comportamento específico não está disponível no SQL Server ou no .NET (pelo menos não de forma nativa), embora ambos estejam em conformidade com a especificação principal do Unicode.
O projeto ICU (International Components for Unicode) é um conjunto de bibliotecas C / C ++ e Java que implementa essa funcionalidade, e há até uma demonstração on-line. E em "projetos relacionados", há um link para um projeto .NET que parece ser um invólucro de objeto COM para a biblioteca ICU que permitiria que essa funcionalidade fosse exposta ao código gerenciado. Mas não está claro se esse projeto .NET ainda está ativo.
Mas, para ver esse comportamento em ação, vá para a Demonstração de agrupamento da UTI .
Cole o seguinte na área de texto Entrada , no lado esquerdo:
Defina todas as opções para "padrão". Marque a opção "inserir números de linha" à direita do sortbotão e verifique se a opção "pontos fortes da diferença" está desmarcada.
Clique no sortbotão e você deverá recuperar o seguinte:
É o que se deve esperar ao fazer uma classificação típica de string e o que você está vendo no SQL Server.
Agora, na série de botões de opção logo acima do sortbotão, a segunda linha é rotulada como "numérica". Selecione o botão de opção "ativado".
Clique no sortbotão novamente e você deverá recuperar o seguinte:
Questionando se isso funciona quando a parte numérica está no meio da string? Ok, cole o seguinte na área de texto Entrada no lado esquerdo (substituindo a lista anterior):
Verifique se a configuração numérica ainda está definida como "ativada". Clique no sortbotão novamente e você deverá recuperar o seguinte:
Deseja ver isso em outro lugar? Crie uma pasta no seu disco rígido, algo como C: \ temp \ sorting \ , e crie arquivos vazios com os mesmos nomes "Script -...". Faça um
DIR
em uma janela de comando e você verá a classificação padrão. Mas, ao examinar a lista de arquivos no Windows Explorer, você verá a lista classificada usando a opção "numérico" :-).fonte