Подтвердить что ты не робот

Строка SQLite ORDER BY, содержащая номер, начинающийся с 0

как указано в заголовке:

У меня есть запрос select, который я пытаюсь "упорядочить по" полем, содержащим числа, дело в том, что эти числа действительно являются строками, начинающимися с 0, поэтому "order by" делает это...

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

Любые мысли?

EDIT: если я это сделаю: "... ORDER BY (field + 1)" Я могу обойти это, потому что каким-то образом строка внутренне преобразуется в целое. Это способ "официально" преобразовать его, как C atoi?

4b9b3361

Ответ 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
>>>

Как мы можем видеть, это немного медленнее, хотя и не намного, интересно.

Ответ 2

Вы можете использовать CAST:

ORDER BY CAST(columnname AS INTEGER)

Ответ 3

В ListView с загрузчиком курсора!

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

Ответ 4

Благодаря Skinnynerd. с Котлином, CAST работал следующим образом: CAST исправляет проблемы определения приоритетов 9 над 10 ИЛИ 22 по 206.

определить глобальную переменную для последующего изменения по требованию, а затем включить ее в запрос:

var SortOrder:String?=null

чтобы изменить порядок использования:

Для потомка:

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

(от самого высокого до самого низкого)

При возрастании:

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

(от самого низкого до самого высокого)

Ответ 5

Функция CONVERT CAST с использованием формата числа по значению столбца в SQL SERVER

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