• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sortowanie liczb double z bazy danych

Object Storage Arubacloud
0 głosów
427 wizyt
pytanie zadane 8 kwietnia 2019 w SQL, bazy danych przez progNewbie Obywatel (1,130 p.)
Hej Wam,

W bazie danych trzymam rekordy, które zawierają przypisane do siebie kody (format double). Przy wypluwaniu ich z bazy danych chciałbym aby były uporządkowane numerycznie od najmniejszej do największej.

Problem pojawia się przy tym, że 1.2 > 1.10 co jest od strony matematycznej logiczne, jednakże chciałbym uzyskać efekt aby 1.10 było traktowane jako większe niż 1.2

Kombinuję z rozbiciem tego na 2 części czyli jeśli pierwszy człon jest równy to sortuj po drugim członie i wydaję mi się, że od strony logicznej jest to okej opracowane, ale nie mam pojęcia jak to przełożyć na skrypt.

Ktoś podrzuci może jakiś podobny case, gdzie mógłbym o tym poczytać?
komentarz 8 kwietnia 2019 przez adrian17 Ekspert (344,860 p.)

jednakże chciałbym uzyskać efekt aby 1.10 było traktowane jako większe niż 1.2

Jeśli nie funkcjonują jak liczby, to może jednak nie powinny być typu liczbowego? Tekst byłby posortowany właśnie w ten sposób.

komentarz 8 kwietnia 2019 przez progNewbie Obywatel (1,130 p.)
Nie, testowałem to i wciąż interpretuje, że 1.2 > 1.10

2 odpowiedzi

+1 głos
odpowiedź 9 kwietnia 2019 przez Hexatorn Bywalec (2,240 p.)
wybrane 10 czerwca 2019 przez progNewbie
 
Najlepsza

Uważam że powinno być to przechowywane jako tekst aby działało. Lub przynajmniej skonwertowane do tekstu przed sortowaniem.

Aby było dobrze sortowane to do wartości 1.2 powinieneś dopisać spacje na końcu. I tak samo we wszystkich innych przypadkach gdy masz jedną cyfrę po przecinku. Jeżeli by była wartość np. 1.234 to trzeba uzupełnić odpowiednio jedną lub dwiema spacjami na końcu.

Czyli:
1.10 -> "1.10"
1.2 -> "1.2 "

Po dopisaniu spacji zacznie ci sortować zgodnie z założeniami.
Przemyśl ile miejsc po przecinku chcesz mieć aby wiedzieć do ilu chcesz uzupełniać. A także czy przed przecinkiem pojawią się liczby dwucyfrowe.
I jeżeli przed przecinkiem pojawią się liczby dwucyfrowe lub większe to tam analogicznie także musisz uzupełnić spacjami, tyle że z przodu.

<------------------------------------------------EDITED------------------------------------------------>

Mea culpa. Przepraszam za wprowadzanie w błąd. Nadal uważam że ścieżka z przechowywaniem jako tekst jest słusznym tokiem postępowania. Ale samo posotrowanie wymaga rozdzielenia i skonwertowania do liczb całkowitych a nie sortowania jako tekstu.

Tu kod zapytania. W moim wypadku zapytanie wykonane na bazie Sqlite

select value
from (
    select  value,
            cast(substr(value,0,instr(value,"."))AS INTEGER) as before,
            cast(substr(value,instr(value,".")+1)AS INTEGER) after
    from test
    order by before asc, after asc)

A tu kod tworzący tabele na których testowałem
 

CREATE TABLE test ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, value varchar(255) );

insert into test (value) values ("1.10");
insert into test (value) values ("1.2");
insert into test (value) values ("10.1");
insert into test (value) values ("5.6");
insert into test (value) values ("1.15");
insert into test (value) values ("3.3");
insert into test (value) values ("5.16");


Przechowywanie danych jako double, float itp... dodatkowo skomplikuje (lub nawet uniemożliwo) sprawę bo tam 1.10 zostanie automatycznie zamienione na 1.1 i\lub na odwrót.
 

komentarz 9 kwietnia 2019 przez progNewbie Obywatel (1,130 p.)
A testowałeś to? U mnie wciąż sortuje w ten sam sposób czyli "1.2 " > "1.10".

Typ ustawiony jako "TEXT".
komentarz 9 kwietnia 2019 przez Hexatorn Bywalec (2,240 p.)
Nie.

Jak będę miał chwilę wyskrobać jakiś kod testowy w ramach relaxu to go tu podrzucę.
komentarz 14 kwietnia 2019 przez Hexatorn Bywalec (2,240 p.)
Faktycznie nie działa to tak jak opisałem. Zedytowałem post aby nie wprowadzać w błąd.
komentarz 10 czerwca 2019 przez progNewbie Obywatel (1,130 p.)
Hej, dzięki za wrzutę, sprawdzę ją.

Na ten moment zrobiłem tak, że dodałem dodatkową kolumnę w DB i opracowałem skrypt przerabiający ten tekst double na zwykłą liczbę uwzględniając tam kilka wyjątków i też śmiga.
0 głosów
odpowiedź 8 kwietnia 2019 przez Bosswell Nałogowiec (36,470 p.)

Może w ten sposób?

http://sqlfiddle.com/#!9/f521d/3/0

komentarz 9 kwietnia 2019 przez progNewbie Obywatel (1,130 p.)
Wygląda to serio dobrze, ale co w przypadku gdy w przyszłości będą 3,4 człony itd.

Będę musiał dodawać kolejne kolumny w DB i jeszcze bardziej już na jej poziomie rozbijać insertowany kod?

Podobne pytania

0 głosów
1 odpowiedź 2,604 wizyt
pytanie zadane 29 grudnia 2018 w Java przez msukiennik Początkujący (380 p.)
+1 głos
1 odpowiedź 3,551 wizyt
pytanie zadane 27 września 2018 w C i C++ przez inf123 Nowicjusz (220 p.)
0 głosów
0 odpowiedzi 215 wizyt
pytanie zadane 26 maja 2018 w C i C++ przez Ala123456 Użytkownik (760 p.)

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...