Mam numery zapisane VARCHAR
w bazie danych MySQL. Nie mogę ich wykonać z INT
powodu innych zależnych okoliczności.
Podczas sortowania traktuje je jako znak, a nie liczbę.
W bazie danych mam
1 2 3 4 5 6 7 8 9 10...
Na mojej stronie pokazuje uporządkowaną listę w następujący sposób:
1 10 2 3 4 5 6 7 8 9
Jak mogę sprawić, by pojawiał się w kolejności rosnącej?
Odpowiedzi:
Jeśli to możliwe, należy zmienić typ danych kolumny na liczbę, jeśli i tak przechowujesz tylko liczby.
Jeśli nie można tego zrobić, a następnie oddać wartość kolumny do
integer
wyraźnie zlub pośrednio, na przykład za pomocą operacji matematycznej, która wymusza konwersję na liczbę
BTW MySQL konwertuje łańcuchy od lewej do prawej. Przykłady:
źródło
1
decimal
.Inny sposób, bez użycia jednego odlewu.
(Dla osób, które używają JPA 2.0, gdzie przesyłanie nie jest dozwolone)
EDYCJA: działa tylko dla dodatnich liczb całkowitych
źródło
Inny i prosty sposób
ORDER BY ABS(column_name)
źródło
Kolumna, z którą sortuję, ma dowolną kombinację alfanumeryczną i liczbową, więc użyłem sugestii w tym poście jako punktu wyjścia i wymyśliłem to.
Wyniki
Mam nadzieję że to pomoże
źródło
1 - ISNUMERIC(ID)
zamiast,(CASE WHEN ISNUMERIC(ID) = 1 THEN 0 ELSE 1 END)
aby zmienić 0 na 1 i odwrotnie.To działa dla mnie.
źródło
Inny sposób na konwersję.
Jeśli masz pole tekstowe, możesz je przekształcić lub jego część numeryczną w następujący sposób: dodaj zera wiodące, aby wszystkie ciągi liczb całkowitych miały równą długość.
lub uporządkuj według części pola coś w rodzaju „tensymbols13”, „tensymbols1222” itd.
źródło
Szukałem również pól sortowania, które mają prefiks literowy. Oto, co znalazłem rozwiązanie. Może to pomóc temu, kto szuka tego samego rozwiązania.
Wartości pól:
SUBSTRING(field,3,9)
wstawiam 9, ponieważ 9 jest wystarczające dla mnie do przechowywania maksymalnie 9-cyfrowych wartości całkowitych.Wynik będzie więc 123456789 123456788 123456787 ... 100 99 ... 2 1
źródło
To poradzi sobie z liczbami ujemnymi, ułamkami, ciągami, wszystkim:
źródło
Może pomóc, kto szuka tego samego rozwiązania.
źródło
Jeśli korzystasz z AdonisJS i masz mieszane identyfikatory, takie jak ABC-202, ABC-201 ..., możesz łączyć nieprzetworzone zapytania z Query Builder i wdrożyć powyższe rozwiązanie ( https://stackoverflow.com/a/25061144/4040835 ) następująco:
UWAGI: W tej linii:
SUBSTRING(:sortField:,3,15)*1 ${sortDirection}
,Ref 1: Możesz przeczytać więcej o wiązaniach parametrów w zapytaniach surowych tutaj: https://knexjs.org/#Raw-Bindings Ref 2: Adonis Raw Queries: https://adonisjs.com/docs/4.1/query-builder# _raw_queries
źródło
Zmień swoje pole na INT zamiast VARCHAR.
Następnie najpierw napraw zależne okoliczności. W przeciwnym razie będziesz pracować nad prawdziwym podstawowym problemem. Korzystanie z MySQL CAST jest opcją, ale maskuje twój zły schemat, który powinien zostać naprawiony.
źródło