web-dev-qa-db-fra.com

SQLite ORDER BY chaîne contenant un nombre commençant par

comme le titre l'indique:

J'ai une requête select, que j'essaie de "classer par" un champ contenant des nombres, le fait est que ces nombres sont en réalité des chaînes commençant par des 0, donc le "classement par" le fait ...

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

Des pensées?

EDIT: si je fais ceci: "... ORDER BY (field + 1)" Je peux contourner ce problème, car en quelque sorte la chaîne est convertie en interne en entier. Est-ce le moyen de convertir "officiellement" comme un atoi de C? 

33

Vous pouvez utiliser CASThttp://www.sqlite.org/lang_expr.html#castexpr pour convertir l'expression en un entier.

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>

si je fais ceci: "... ORDER BY (field + 1)", je peux contourner ce problème car, d'une manière ou d'une autre, la chaîne est convertie en interne en entier. Est-ce un moyen de le convertir "officiellement" comme un atoi de C?

Eh bien, c’est intéressant, bien que je ne sache pas combien de DBMS prennent en charge une telle opération, aussi je ne le recommande pas au cas où vous auriez besoin d’utiliser un système différent qui ne le prend pas en charge, sans compter que vous ajoutez une opération supplémentaire, ce qui peut affecter les performances, même si vous faites également ceci ORDER BY (field + 0) Je vais étudier les performances

extrait des documents sqlite3:

Une expression CAST est utilisée pour convertir la valeur de en une classe de stockage différente, de la même manière que la conversion effectuée affinité de colonne est appliqué à une valeur. L'application d'une expression CAST diffère de l'application d'une affinité de colonne, car avec une expression CAST, la conversion de classe de stockage est forcée même si elle entraîne des pertes et est irréversible.

4.0 opérateurs
Tous les opérateurs mathématiques (+, -, *, /,%, <<, >>, & et |) convertissent les deux opérandes dans la classe de stockage NUMERIC avant leur exécution. Le casting est réalisé même s'il est avec perte et irréversible. Un opérande NULL sur un opérateur mathématique donne un résultat NULL. Un opérande sur un opérateur mathématique qui n'a pas l'apparence numérique et qui n'est pas NULL est converti en 0 ou 0.0.

J'étais curieux alors j'ai couru quelques points de repère:

>>> 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
>>>

Comme on peut le voir, il est un peu plus lent mais pas trop intéressant.

62
Samy Vilar

Vous pouvez utiliser CAST:

ORDER BY CAST(columnname AS INTEGER)
27
skinnynerd

Dans ListView avec le chargeur de curseur!

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

Merci à Skinnynerd . avec Kotlin, CAST fonctionnait comme suit: CAST corrige le problème de la hiérarchisation des priorités 9 sur 10 OR 22 sur 206.

définissez la variable globale à modifier ultérieurement sur demande, puis insérez-la dans la requête:

var SortOrder:String?=null

pour modifier l'ordre utiliser:

Pour descendant:

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

(du plus haut au plus bas)

Pour monter:

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

(du plus bas au plus élevé)

0
BlackHatVisions

CONVERT CAST fonction utilisant le format d'ordre numéro de valeur de colonne dans SQL SERVER

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