Puede utilizar CAST
http://www.sqlite.org/lang_expr.html#castexpr para emitir la expresión a un entero.
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 hago esto: "... ORDER BY (campo + 1)" puedo solucionar esto, porque de alguna manera la cadena interna está siendo convertido a entero. ¿Es la forma de convertirlo "oficialmente" como el atoi de C?
Bueno eso es interesante, aunque yo no sé cuántas DBMS
apoyo tal operación, así que no lo recomiendo si acaso alguna vez tiene que utilizar un sistema diferente que no soporta, por no hablar de que están añadiendo una operación extra, lo que puede afectar al rendimiento, aunque también se hace esto ORDER BY (field + 0)
Im que va a investigar el rendimiento
tomado de los documentos SQLite3:
una expresión de conversión se utiliza para convertir el valor de a una clase de almacenamiento diferente de forma similar a la c onversion que tiene lugar cuando se aplica una afinidad de columna a un valor. La aplicación de una expresión CAST es diferente de la aplicación de una afinidad de columna, ya que con una expresión CAST la conversión de la clase de almacenamiento se fuerza incluso si es con pérdida e irreversible.
4.0 Operadores
todos los operadores matemáticos (+, -, *, /,%, < <, >>, &, y |) Reparto de los dos operandos a la clase de almacenamiento numérico antes de ser llevado a cabo. El yeso se lleva a cabo incluso si es con pérdida e irreversible. Un operando NULL en un operador matemático produce un resultado NULO. Un operando en un operador matemático que no se ve de ninguna manera numérico y no es NULL se convierte en 0 o 0.0.
que era curiosidades así que corrieron algunos puntos de referencia:
>>> 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
>>>
Como podemos ver es un poco más lento, aunque no por mucho, interesante.
¿Cómo le va ese resultado? ¿Estás seguro de que las cadenas solo tienen ceros a la izquierda o también son los espacios principales involucrados? –
La cadena no tiene espacios iniciales. Estaba tratando de encontrar una manera de ordenar cadenas que contengan números (1,2,3 ..., 10,11,12) sin que se clasifiquen en la forma 1,10,2,3,4,5. Agregué manualmente el 0 principal, lo intenté con espacios también, pero ahora veo que lanzar la columna a INTEGER fue lo más inteligente que se puede hacer en primer lugar. –
Pero ''01'' debería venir antes de '' 10'' cuando están ordenados como cadenas, de ahí mi curiosidad. ¿O estás diciendo que realmente tienes '' 1'' en lugar de ''01'' en la base de datos? –