Numaraya göre sıralama için SQL - 1,10,11,12 yerine 1,2,3,4 vb.


87

Veritabanımda 1-999 değerlerine sahip bir sayı sütununa göre sıralama yapmaya çalışıyorum

Kullandığım zaman

ORDER_BY registration_no ASC

Alırım….

1
101
102
103
104
105
106
107
108
109
11
110
Etc…

Bu nedenle, numaranın aksine ilk haneye göre sıralanıyor gibi görünüyor.

Bunu değere göre sipariş etmek istersem hangi SQL'i kullanacağımı bilen var mı? Yani 1,2,3,4,5,6vb


11
Sütununuz, bu davranışla karşı karşıya olduğunuz için varchar türündedir.
Meherzad

Registration_no sütununun veri türü nedir?
Praveen Prasannan

9
order by registration_no + 0 ascSorununuzu çözmek için kullanın .
Meherzad

10
Sen gerektiğini asla bir karakter sütunda sayılar saklayın. Sizin sorununuz, bu hatanın doğrudan bir sonucudur.
a_horse_with_no_name

1
Sütunum Varchar ve depoladığım veriler Sınıf 10 / Sınıf 9 / Sınıf 8'dir. Şimdi sınıf 10, sınıf 8'den önce geliyor. Bunu bir display_order sütunu için uğraşmak zorunda kalmadan nasıl çözebilirim?
ViShNoO Rath

Yanıtlar:


142

Pozitif tamsayılara göre sıralamanın bir yolu, oldukları gibi depolandıklarında varchar, önce uzunluğa ve ardından değere göre sıralamaktır:

order by len(registration_no), registration_no

Bu, özellikle sütun sayısal olmayan değerler içerdiğinde yararlıdır.

Not: Bazı veritabanlarında, bir dizenin uzunluğunu alma işlevi length()yerine çağrılabilir len().


1
Bu her durumda işe yaramayacaktır. İşe yaramayacak durumlar, tam sayıların karışımlarıdır; negatif sayılar, başında sıfır olan sayılar, kesirli sayılar ve birleştirilmiş sözcükler ve sayılar.
WonderWorker

10
@ Knickerless-Noggins. . . Cevabın ilk cümlesini okuyun. Sanırım oldukça açık.
Gordon Linoff

@GordonLinoff aynı sütuna göre iki kez sipariş veriyor, işlemci ve bellek yoğun değil mi?
loneStar

@Achyuth. . . Anahtar sayısının order byperformans üzerinde çok az etkisi vardır.
Gordon Linoff

1
Oracle SQL için length()bunun yerine kullanınlen()
Stevoisiak

62
ORDER_BY cast(registration_no as unsigned) ASC

değeri açıkça bir sayıya dönüştürür. Aynı şeyi başarmanın başka bir yolu da

ORDER_BY registration_no + 0 ASC

bu da üstü kapalı bir konuşmayı zorlar.

Aslında tablo tanımını kontrol etmeli ve değiştirmelisiniz. Veri türünü intbu şekilde değiştirebilirsiniz

ALTER TABLE your_table MODIFY COLUMN registration_no int;

13

SQL Server kullanıyorsanız:

ORDER_BY cast(registration_no as int) ASC

4
ORDER_BY cast(registration_no as unsigned) ASC

uyarılarla istenilen sonucu verir.

Bu nedenle, gitmek daha iyi

ORDER_BY registration_no + 0 ASC

SQL uyarıları olmadan temiz bir sonuç için.


Neden işe + 0yaradığını açıklayabilir misin ? Veri setimde test ettim ve gerçekten işe yarıyor, ama nedenini merak ediyorum? Sipariş vermeden önce numaraya çeviriyor mu?
Joshua Pinter

2

Sütun türünüzün STRING (CHAR, VARCHAR, vb.) Olduğunu ve sıralama prosedürünün onu bir dizge olarak sıraladığını varsayıyorum. Yapmanız gereken, değeri sayısal değere dönüştürmektir. Nasıl yapılacağı, kullandığınız SQL sistemine bağlı olacaktır.


1

Bazen sayıları metinle karışık olarak saklamak zorunda kalmazsınız. Uygulamalarımızdan birinde, e-ticaret sitemiz için kullandığımız web sitesi barındırıcısı, listelerden dinamik olarak filtreler çıkarır. Görüntülenen metin dışında herhangi bir alana göre sıralama seçeneği yoktur. Filtrelerin 2 "ila 8" 9 "ila 12" 13 "ila 15" gibi şeyler söyleyen bir listeden oluşturulmasını istediğimizde, 13-2-9'u ne zaman olacağı gibi değil, 2-9-13'ü sıralaması gerekti sayısal değerleri okumak. Bu yüzden, SQL Server Replicate işlevini en uzun sayının uzunluğuyla birlikte, daha kısa sayıları baştaki bir boşlukla doldurmak için kullandım. Şimdi 20, 3'ten sonra sıralanır ve bu böyle devam eder.

Öğe türü ve sınıfı için bana minimum ve maksimum uzunlukları, genişlikleri vb. Veren bir görünümle çalışıyordum ve işte metni nasıl yaptığıma dair bir örnek. (LB n Düşük ve LB n Yüksek, 5 uzunluk parantezinin Düşük ve Yüksek sonlarıdır.)

REPLICATE(' ', LEN(LB5Low) - LEN(LB1High)) + CONVERT(NVARCHAR(4), LB1High) + '" and Under' AS L1Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB2Low)) + CONVERT(NVARCHAR(4), LB2Low) + '" to ' + CONVERT(NVARCHAR(4), LB2High) + '"' AS L2Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB3Low)) + CONVERT(NVARCHAR(4), LB3Low) + '" to ' + CONVERT(NVARCHAR(4), LB3High) + '"' AS L3Text,
REPLICATE(' ', LEN(LB5Low) - LEN(LB4Low)) + CONVERT(NVARCHAR(4), LB4Low) + '" to ' + CONVERT(NVARCHAR(4), LB4High) + '"' AS L4Text,
CONVERT(NVARCHAR(4), LB5Low) + '" and Over' AS L5Text

1

Verilere "PAD" yapmayı tercih ederim. MySql buna LPAD diyor, ancak aynı şeyi SQL Server'da yapmak için kendi yolunuza çalışabilirsiniz.

ORDER BY  REPLACE(STR(ColName, 3), SPACE(1), '0') 

Bu formül, Sütunun 3 uzunluğuna göre baştaki sıfırları sağlayacaktır. Bu işlevsellik ORDER BY dışındaki diğer durumlarda çok kullanışlıdır, bu yüzden bu seçeneği sunmak istedim.

Sonuçlar: 1, 001 olur ve 10, 010 olurken 100 aynı kalır.


0

Bu sorun, sütunu CHAR, VARCHAR veya TEXT veri türünde tanımlamış olmanızdır. Sadece veri türünü INT, BIGINT vb. Olarak değiştirin. Bu, özel siparişinizin sorununu çözecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.