web-dev-qa-db-de.com

SQLite ORDER BY-String, der die Nummer enthält, die mit beginnt

wie der Titel besagt:

Ich habe eine Auswahlabfrage, die ich versuche, ein Feld zu "sortieren", das Zahlen enthält. Die Sache ist, dass diese Zahlen wirklich Zeichenfolgen sind, die mit 0 beginnen, also macht das "Sortieren nach" ...

...
10
11
12
01
02
03
...

Irgendwelche Gedanken?

BEARBEITEN: wenn ich folgendes mache: "... ORDER BY (Feld + 1)" Ich kann dies umgehen, da der String irgendwie intern in eine Ganzzahl konvertiert wird. Ist dies eine Möglichkeit, sie "offiziell" wie C's Atoi umzuwandeln? 

Sie können CASThttp://www.sqlite.org/lang_expr.html#castexpr verwenden, um den Ausdruck in eine Ganzzahl umzuwandeln.

sqlite> CREATE TABLE T (value VARCHAR(2));
sqlite> INSERT INTO T (value) VALUES ('10');
sqlite> INSERT INTO T (value) VALUES ('11');
sqlite> INSERT INTO T (value) VALUES ('12');    
sqlite> INSERT INTO T (value) VALUES ('01');
sqlite> INSERT INTO T (value) VALUES ('02');
sqlite> INSERT INTO T (value) VALUES ('03');
sqlite> SELECT * FROM T ORDER BY CAST(value AS INTEGER);
01
02
03
10
11
12
sqlite>

wenn ich folgendes mache: "... ORDER BY (Feld + 1)", kann ich dies umgehen, da der String irgendwie in eine Ganzzahl konvertiert wird. Ist der Weg, ihn "offiziell" wie C's Atoi umzuwandeln?

Nun, das ist interessant, auch wenn ich nicht weiß, wie viele DBMS eine solche Operation unterstützen. Daher empfehle ich sie nicht, nur für den Fall, dass Sie ein anderes System verwenden müssen, das sie nicht unterstützt. was sich auf die Leistung auswirken kann, obwohl Sie dies auch tun ORDER BY (field + 0) Ich werde die Leistung untersuchen

aus den sqlite3-Dokumenten entnommen:

Ein CAST-Ausdruck wird verwendet, um den Wert von in eine andere Speicherklasse zu konvertieren, ähnlich wie bei der Konvertierung von a spaltenaffinität wird auf einen Wert angewendet. Die Anwendung eines CAST-Ausdrucks unterscheidet sich von der Anwendung einer Spaltenaffinität, da bei einem CAST-Ausdruck die Konvertierung der Speicherklasse erzwungen wird, auch wenn sie verlustbehaftet und irreversibel ist.

4.0 Betreiber
Alle mathematischen Operatoren (+, -, *, /,%, <<, >>, & und |) setzen beide Operanden in die Speicherklasse NUMERIC um, bevor sie ausgeführt werden. Der Abguss wird auch dann durchgeführt, wenn er verlustbehaftet und irreversibel ist. Ein NULL-Operand eines mathematischen Operators führt zu einem NULL-Ergebnis. Ein Operand eines mathematischen Operators, der in keiner Weise numerisch aussieht und nicht NULL ist, wird in 0 oder 0,0 konvertiert.

Ich war neugierig und habe einige Benchmarks durchgeführt:

>>> setup = """
... import sqlite3
... import timeit
... 
... conn = sqlite3.connect(':memory:')
... c = conn.cursor()
... c.execute('CREATE TABLE T (value int)')
... for index in range(4000000, 0, -1):
...     _ = c.execute('INSERT INTO T (value) VALUES (%i)' % index)
... conn.commit()
... """
>>> 
>>> cast_conv = "result = c.execute('SELECT * FROM T ORDER BY CAST(value AS INTEGER)')"
>>> cast_affinity = "result = c.execute('SELECT * FROM T ORDER BY (value + 0)')"
>>> timeit.Timer(cast_conv, setup).timeit(number = 1)
18.145697116851807
>>> timeit.Timer(cast_affinity, setup).timeit(number = 1)
18.259973049163818
>>>

Wie wir sehen können, ist es etwas langsamer, wenn auch nicht viel interessant.

62
Samy Vilar

Sie könnten CAST verwenden:

ORDER BY CAST(columnname AS INTEGER)
27
skinnynerd

In ListView mit Cursor Loader!

String projection= some string column;
String selection= need to select;

String sort="CAST ("+ YOUR_COLUMN_NAME + " AS INTEGER)";

CursorLoader(getActivity(), Table.CONTENT_URI, projection, selection, selectionArgs, sort);
3
Ko Nyan

Danke an Skinnynerd . mit Kotlin funktionierte CAST wie folgt: CAST behebt die Probleme der Priorisierung von 9 über 10 OR 22 über 206.

definieren Sie die globale Variable, um sie später bei Bedarf zu ändern, und fügen Sie sie in die Abfrage ein:

var SortOrder:String?=null

um die Bestellung zu ändern, verwenden Sie:

Für Nachkommen:

 SortOrder = "CAST(MyNumber AS INTEGER)" + " DESC"

(vom höchsten zum niedrigsten)

Aufsteigend:

 SortOrder =  "CAST(MyNumber AS INTEGER)" + " ASC"

(vom niedrigsten zum höchsten)

0
BlackHatVisions

CONVERT CAST Funktion mit dem Format der Spaltenreihenfolge in SQL SERVER

SELECT * FROM Table_Name ORDER BY CAST(COLUMNNAME AS INT);
0
wilfred