Ответ 1
Вы можете использовать CAST
http://www.sqlite.org/lang_expr.html#castexpr, чтобы выразить выражение в Integer.
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>
если я это сделаю: "... ORDER BY (field + 1)" Я могу обойти это, потому что каким-то образом строка внутренне преобразуется в целое. Является ли способ "официально" преобразовать его, как C atoi?
Ну, это интересно, хотя я не знаю, сколько DBMS
поддерживает такую операцию, поэтому я не рекомендую ее на всякий случай, если вам когда-либо понадобится использовать другую систему, которая ее не поддерживает, не говоря уже о том, что вы добавив дополнительную операцию, которая может повлиять на производительность, хотя вы также делаете это ORDER BY (field + 0)
Im, чтобы исследовать производительность
взятый из документации sqlite3:
Выражение CAST используется для преобразования значения в другой класс хранения аналогично преобразованию, которое происходит, когда аффинность столбца применяется к значению. Применение выражения CAST отличается от применения сходства столбцов, так как с выражением CAST преобразование класса хранения принудительно, даже если оно является потерянным и необратимым.
4.0 Операторы
Все математические операторы (+, -, *,/,%, <, → , & и |) передавали оба операнда в класс хранения NUMERIC перед выполнением. Бросок переносится, даже если он потерян и необратим. Оператор NULL на математическом операторе дает результат NULL. Операнд на математическом операторе, который никоим образом не выглядит числовым и не равен NULL, преобразуется в 0 или 0,0.
Я был любопытным, поэтому я запустил несколько тестов:
>>> 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
>>>
Как мы можем видеть, это немного медленнее, хотя и не намного, интересно.